676 文字
3 分
armとintelのdocker-compose共通化へ向けて(mysql編)

追記#

Officialの方でもarm64に対応していたのでオフィシャルをそのまま使えそうです。

この記事を書いた時点ではまだリリースされていませんでした。

https://x.com/matsubokkuri/status/1696078129100660767

背景#

  • m1(arm)のmacで既存プロジェクトのdocker-compose upをすると以下のようなエラーが出ます。
    • Host '172.21.0.4' is not allowed to connect to this MySQL server
  • 理由はこちらの記事がよくまとまっています。

アプローチ#

あちこちで使われている、Docker公式イメージである、‘mysql’ はamd用しか提供されていません。arm用は、別のイメージ名で提供されているようです。

しかしながら、Docker HubにあるMySQLが提供している、mysql/mysql-server イメージはintel用とarm用を提供しています。設定ファイルを共通化したいのでimage名が同じマルチアーキテクチャビルドしてあるmysql/mysql-serverを使います。

MySQL Server 8.0, the latest GA, for both x86 and AArch64(ARM64) architectures (tag: 8.0latest) (mysql-server/8.0/Dockerfile)

https://hub.docker.com/r/mysql/mysql-server

なので、mysql/mysql-server を指定することで設定を共通化できます。

https://gist.github.com/matsubo/94666cf045af3ad8f91fada59116a1dd

しかしながら、Docker Hubのイメージと、MySQLが出しているイメージは初期化スクリプトがちょっと違うようなので設定を追加で行う必要がありました。(上記の差分を参照)

初期#

mysqlの/entrypoint.shの中で、MYSQL_ROOT_HOSTが参照されるのはmysqlのdataディレクトリが未作成の時だけです。

データディレクトリが存在しないか、消した状態で上記の設定を動かせば特に気にする必要はありません。

MYSQL_ROOT_HOSTオプション無しで作成済みの場合#

ファイルのownerを設定#

volumeを永続化している場合は、以下のようなコマンドを打ってownerを再設定する必要があります。imageによってuser idが変わっているためです。

Terminal window
docker-compose run --rm db chown -R mysql.mysql /var/lib/mysql /run/mysqld/

接続元許可#

作成済みの場合は、権限を変えてあげる必要があります。

docker-compose run db bashとかして、mysql -u rootとかして、DBに特権でログインします。

以下のようなクエリーを打って、権限情報を変更します。変数部分は手元の環境に合わせて置き換えてください。

MYSQL_ROOT_HOSTは、%にします。

ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
CREATE USER 'root'@'${MYSQL_ROOT_HOST}' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL ON *.* TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ;
GRANT PROXY ON ''@'' TO 'root'@'${MYSQL_ROOT_HOST}' WITH GRANT OPTION ;

まとめ#

  • ちょっと前までは、Dockerfile自体を分ける必要がありましたが、今はDockerfileとdocker-compose.ymlを別にする必要はなさそうです。
  • armでの開発環境構築がかなりスムーズになりそう。
armとintelのdocker-compose共通化へ向けて(mysql編)
https://blog.teraren.com/posts/arm-intel-docker-compose-in-the-same-file/
作者
Yuki Matsukura
公開日
2022-05-02
ライセンス
CC BY-NC-SA 4.0

コメント