一尘不染

docker-entrypoint-initdb中的MySQL脚本未执行

docker

我正在尝试在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;

我构建并运行容器:

$ 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,结果是相同的。

可能是什么问题呢?


阅读 2008

收藏
2020-06-17

共1个答案

一尘不染

在运行容器之前,请先将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源上获得更多详细信息

2020-06-17