
我的目標是在 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 中運行,並且只有在已運行的容器中執行後才能運行。我想需要不同的解決方案。
如何自動執行這些 sql 指令,而不必使用 docker exec 手動執行它們?謝謝
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/setting-up-mysql-and-importing-dump-within-dockerfile