docker-entrypoint-initdb中的MySQL脚本不会被执行

我正在尝试创build多个数据库,当一个MySQL容器启动。 根据https://github.com/docker-library/mysql/pull/18 ,我可以在映像的/docker-entrypoint-initdb.d中挂载或复制我的脚本,它们将在启动时自动执行。

但是我的脚本根本不能执行。 看起来像docker-entrypoint.sh没有看到/docker-entrypoint-initdb.d目录中的文件。

这是我的Dockerfile:

 FROM mysql ADD script.sql /docker-entrypoint-initdb.d/script.sql RUN chmod -R 775 /docker-entrypoint-initdb.d ENV MYSQL_ROOT_PASSWORD mypass 

这是我的script.sql

 CREATE DATABASE mydb; CREATE DATABASE mydb2; 

我build立并运行容器:

 $ docker build -t mysql . $ docker run -v data_volume:/var/lib/mysql --name somedb -d mysql 

当我在tty中访问容器时,我可以看到script.sql/docker-entrypoint-initdb.d但是没有被执行。

我已经看到docker logs -f somedb输出,但没有错误。

我用.sh文件试过,我也用Maria-db尝试过,结果是一样的。

可能是什么问题呢?

在运行容器之前,请先将data_volume设为空。 和你的SQL文件将被肯定执行。

问题在这里:

在docker-entrypoint.sh中,使用/ var / lib / mysql中的mysql目录的存在检查第一次运行

 if [ ! -d "$DATADIR/mysql" ]; then //Some other logic here for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;; *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;; *) echo "$0: ignoring $f" ;; esac echo done 

你可以在Dockerfile源代码获得更多的细节

你有没有解决这个问题呢?

一个简单的解决方法是在读取/docker-entrypoint-initdb.d/中的文件时使用绝对path

我使用默认configuration进行testing: https : //github.com/docker-library/mysql/blob/master/5.7/Dockerfile#L70

在执行之前,docker-entrypoint.sh首先移动到/ usr / local / bin。

然后它来读取/docker-entrypoint-initdb.d/中的文件,但以下内容:

 for f in /docker-entrypoint-initdb.d/*; do 

似乎没有find任何东西。

如果您将其replace为:

 for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do 

然后确保该文件夹由Dockerfile命令填充:

 COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh COPY docker-entrypoint-initdb.d/ /usr/local/bin/docker-entrypoint-initdb.d/ RUN chmod -R +x /usr/local/bin/docker-entrypoint-initdb.d 

从那里,在/docker-entrypoint-initdb.d/test.sql中build立一个testing语句

 CREATE DATABASE `test`; 

最后构build并运行映像,您应该看到您的数据库已创build。

不是真正的答案,但我通常这样做:

 RUN mkdir -p /docker-entrypoint-initdb.d && mv myScript.sql /docker-entrypoint-initdb.d/myScript.sql 

不要以为你的代码有什么问题,但是谁知道。 我想你检查775是正确的所有者? btw即时通讯使用FROM MySQL:5