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