我正在尝试在MySQL容器启动时创建多个数据库。根据https://github.com/docker- library/mysql/pull/18,我可以/docker-entrypoint- initdb.d在映像的中装载或复制脚本,它们将在启动时自动执行。
/docker-entrypoint- initdb.d
但是我的脚本根本没有执行。好像docker-entrypoint.sh在/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:
script.sql
CREATE DATABASE mydb; CREATE DATABASE mydb2;
我构建并运行容器:
$ 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输出,但是没有错误。
docker logs -f somedb
我尝试使用.sh文件,也尝试使用Maria-db,结果是相同的。
.sh
可能是什么问题呢?
在运行容器之前,请先将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源上获得更多详细信息