Docker 中的 SQL 錯誤

Docker 中的 SQL 錯誤

我的目標是在 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

相關內容