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