
私の目標は、Dockerfile でいくつかのコマンドを実行して、SQL ユーザーを作成し、そのユーザーに権限を付与することです。そのため、次の操作を行います。
FROM ubuntu:18.04
...
RUN apt-get install -y apache2
RUN apt-get install -y mysql-server
RUN mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
RUN mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
これは最初のmysqlコマンドでクラッシュします
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ただし、StackExchange を通じて、Dockerfile から sql コマンドを削除し、実行中のコンテナーで docker exec を使用してログインすると、次の解決策が機能することがわかりました。
service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
すべてのコマンドを Dockerfile に含めたいため、上記のservice stop/start
解決策を試しましたが、Dockerfile からは機能せず、すでに実行中のコンテナで exec を実行した後にのみ機能します。別の解決策が必要だと思います。
docker exec で手動で実行せずに、これらの SQL コマンドの実行を自動化するにはどうすればよいですか? ありがとうございます
PS: この質問が別の Stack Exchange サイトに適しているかどうかお知らせください。
答え1
この問題は、すべての RUN コマンドが異なるレイヤーで実行されていることに関係しています。解決策は、関連するすべてのコマンドを bash スクリプト init_db.sh ファイルに追加し、Dockerfile で実行することでした。
#!/bin/bash
service apache2 stop
service mysql stop
service mysql start
service apache2 start
mysql -Bse "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';"
mysql -Bse "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'localhost';"
ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh
ソース:https://stackoverflow.com/questions/25920029/mysql の設定と dockerfile 内でのダンプのインポート