🦔

【Docker】MySQL環境構築で嵌ったところ

2022/02/16に公開

はじめに

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を作成してコマンドをまとめたら下記エラーになった
startup.sh
echo 'test1'
mysqld
echo 'test2'
dockerfile
FROM mysql:8

CMD ["/startup.sh"]
  • シェルファイルを通さずに指定すると問題なかった。
CMD ["msqld"]
  • docker-composeのcommandで実施しても同じだった。
log
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権限で動かすのは禁止
  • シェルファイルを通して間接的に実行すると権限周りでうまく実行できなくなる??

【解決策】

【調査ログ】

少しググった感じでは、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