armとintelのdocker-compose共通化へ向けて(mysql編)

docker

追記

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

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

背景

  • 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 を指定することで設定を共通化できます。

diff –git a/docker-compose.yml b/docker-compose.yml
index 2ebf9f0..8a02a5e 100644
— a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,11 +1,12 @@
version: '3'
services:
db:
– image: mysql:8.0
+ image: mysql/mysql-server:8.0
volumes:
– mysql_data:/var/lib/mysql:cached
environment:
MYSQL_ROOT_PASSWORD: 0fj4l3muBP7tpKtg
+ MYSQL_ROOT_HOST: '%'
app:
build: .
view raw arm.diff hosted with ❤ by GitHub

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

初期

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

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

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

ファイルのownerを設定

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

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での開発環境構築がかなりスムーズになりそう。

コメント