【Docker】MySQL環境構築で嵌ったところ
はじめに
DockerでMySQLを構築していて、ちょくちょく嵌ったので、忘れないようにメモします。
基本的に公式で配布されているイメージを利用して作成しての想定です。
公式ドキュメント
ファイル更新しても、変更が反映されない
Docker初心者なんで、ここら辺からよくわかっていなかった。
docker-compose up -d
ですべてがOKだと思ってました…
これって、docker-compose.yml
が更新されていないと反映してくれないし、コンテナも再起動してくれない模様。
【解決策】
- Dockerファイルや環境設定ファイルを更新したならbuildしてimageを作り直してみる
docker-compose build
- なんやかんや分からん時は、作成したものすべて削除してみる。
docker ps # コンテナID確認
docker rm [コンテナID] # コンテナ削除
docker image ls # イメージID確認
docker image rm [イメージID] # イメージ削除
docker volume ls # ボリューム名確認
docker volume rm [ボリューム名] # ボリューム削除
docker-compose up -d # コンテナ作成・起動
my.cnfが反映されない
my.cnf
に記載した内容が反映されていないし、ログを確認してみると
[Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
が出力されていた
【解決策】
windowsで環境構築している場合、/etc/mysql/conf.d/my.cnf
にマウントしたファイルは読み取り専用にしとかなければならないようです。
参考:【docker-compose】mysqlのmy.cnfが反映されずにうまくいかない。windowsが原因の一つだった。
コンテナ起動に失敗する(Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!)
【概要】
- Dockerfileの最後に複数のコマンドを実行させたかったので、
startup.sh
を作成してコマンドをまとめたら下記エラーになった
echo 'test1'
mysqld
echo 'test2'
FROM mysql:8
CMD ["/startup.sh"]
- シェルファイルを通さずに指定すると問題なかった。
CMD ["msqld"]
- docker-composeの
command
で実施しても同じだった。
mysql | 2022-02-14T02:43:36.394594Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28) starting as process 11
mysql | 2022-02-14T02:43:36.396841Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
mysql | 2022-02-14T02:43:36.396909Z 0 [ERROR] [MY-010119] [Server] Aborting
mysql | 2022-02-14T02:43:36.397034Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.28) MySQL Community Server - GPL.
【原因】
根本的な原因はよくわからなかったですが、以下みたいな感じでしょうか?
- root権限で動かすのは禁止
- シェルファイルを通して間接的に実行すると権限周りでうまく実行できなくなる??
【解決策】
- root権限が不要な操作や、
sql
の実行なら/docker-entrypoint-initdb.d
に.sh
や.sql
を配置するだけです。詳しくは【Docker】【MySQL】コンテナ初回起動時にスクリプトを実行させるを参照してください。
【調査ログ】
少しググった感じでは、my.cnf
に以下の記述をして、実行ユーザを指定するという方法を見つけた。(6.1.5 How to Run MySQL as a Normal User)
[mysqld]
user=user_name
たぶん、MySQLをいちから構築していたりすると解決するのだろう。ただ、公式配布のイメージを使って構築してたりすると、以下の別のエラーが出たりする。
mysql | 2022-02-10T13:14:11.672889Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory.
mysql | 2022-02-10T13:14:11.673085Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
mysql | 2022-02-10T13:14:11.673148Z 0 [ERROR] [MY-010119] [Server] Aborting
今度はディレクトリが見つかりません言われた。ここら辺までくるとMySQLをいちから構築する記事ばかりで、なんか違うなーと思って視点かえて調べなおしたら公式ドキュメントにしっかり方法が書いてあった。
個人的所感
解決はしてみたが、原因についてはふわっとしていて少しモヤっと。
ただ、Docker
は1コンテナ1サービスを想定していると思う。だから、CMD
は複数書いても上書きされ最後の1つが有効になるという動作をする挙動にも納得できる。
CMD
で複数の処理を実行するとかいうする内容もググればあるが…あれって本来Docker
が想定しているような使い方ではない?というような気もしています。
root権限が必要なパッケージのインストールとか、ディレクトリの作成とかの環境構築はRUN
の方で実行すればいいです。(DockerのRUNとCMDの違い)
CMDで実行しなければいけない処理ってサービスの起動ぐらいで、そうそうCMDでどうしても複数コマンドを実行させなければいけない状況ってのが、そうそうないのでは?って結論になった。
Discussion