はじめに
- M1用のDocker for Mac のPreview版に関する記事です。
- 正式版が出た場合は一切役に立たない可能性があります。
- M1のDockerでMySQL、その他で起動しない問題に遭遇したら約に立つかもしれません。
準備
※英語わかんなくてもなんとかなります。
追記)
docker blogでPreview7が公開されました。
https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/
以下はPreview5入手時の手順。
- DockerのDeveloper Preview Programに参加する
- Docker Community Slackに参加する
- Developer Preview Program の案内メールが来るのでDocker Community SlackのDisplay Nameを伝える
- #dev-preview-programに招待される
- #dev-preview-programのpin付けされているメッセージを読んでDokcerのPreview5を入手する
- ここのメッセージに注意事項もセットで記載されてます
インストール
- dmgファイルを実行
- いつもの手順でApplicationsへ入れる(PREVIEWマーク付いてる!)
コンテナ起動
- Docker.appを実行
- 特に問題発生せず
その他
- あっけなく動いてしまった
- 時間かかるのはPreview版を入手するところまで
- 動かないイメージはちらほら(手元で使ってたものは3割動かなかった)
追記
amd64のエミュレーションを機能させる
amd64のimageを使っていても動くはずと思っていましたが、Preview版では動きませんでした。
この問題はPreview5でもPreview7でも対処が必要です。(正式版ではきっと改善されるはず。)
対処方法はimageを指定する際にバージョンではなくハッシュを指定するだけです。
ちなみに以下のようにdocker hubにamd64とarmの両方が用意されている場合もうまくいかないケースがありました。
その場合も対処方法としては利用したいバージョンのハッシュもしくはplatformをセットで指定するだけです。
MySQL 5.6系の起動チェック
MySQL5.6系のリビジョン違いで動かないケースがあるので参考情報として残しておきます。
ハッシュ指定 OK
最初に知ったのはこの方法。
- 実行コマンド
- 5.6.47をハッシュで指定
docker run --rm -it mysql@sha256:7d4df6c491e9b844b8c594c5607cea7465b42bd3d51db3d93359b3e8d06f1518
- 実行結果
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
2020-12-17 17:30:36+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-17 17:30:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-12-17 17:30:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-17 17:30:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
恒例(?)のパスワード要求まで辿りつけます。
バージョン指定 OK
取得したいアーキテクチャを明記すればOK。
- 実行コマンド
docker run --rm --platform linux/amd64 -it mysql:5.6.47
- 実行結果
Unable to find image 'mysql:5.6.47' locally
5.6.47: Pulling from library/mysql
Digest: sha256:852b5dee257c9c23ce410b7d005f9d8f04efa9998059780cd5a358d866c53dea
Status: Downloaded newer image for mysql:5.6.47
2020-12-26 12:04:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-26 12:04:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-12-26 12:04:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-26 12:04:59+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
バージョン指定 NG
バージョン指定で起動しようとするとarmのimageを探しにいってしまいエラーになる。
- 実行コマンド
docker run --rm -it mysql:5.6.47
- 実行結果
Unable to find image 'mysql:5.6.47' locally
5.6.47: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.
バージョン指定 NG
※8.0系はバージョン指定で起動できます。
- 実行コマンド
docker run --rm -it mysql:5.6.46
- 実行結果
Unable to find image 'mysql:5.6.46' locally
5.6.47: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.
ハッシュ指定 NG
- 実行コマンド
- 5.6.46をハッシュで指定
docker run --rm -it mysql@sha256:cb0ea262eb3261fc5c5b2fa8b08b95c642e1ec112736def5f41eb9b85f914c5f
- 実行結果
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
2020-12-17 17:26:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
2020-12-17 17:26:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002e000, 0xc82003dfc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820028770 sp=0xc820028768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200287c0 sp=0xc820028770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200287c8 sp=0xc8200287c0
docker-composeの場合
docker-composeを使っていて
docker-compose up -d --no-deps --build service-name
移行アシスタントでデータを移行してきている場合
docker volumeの削除
※特に不具合ない場合は削除不要。
-
docker volume ls
で不具合が起きているvolumeを確認 -
docker volume rm xxxx
で対象のvolumeを削除( 事前に 対象のvolumeを使用している containerは削除しておく)- MySQLのバージョン変えた場合にうまく起動しない場合は実施。
補足
ハッシュ調べたいときは以下のページでtag(バージョン)を検索。
https://hub.docker.com/_/mysql?tab=tags&page=1&ordering=last_updated