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

新手上路,请多包涵

我正在尝试在 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 试过,结果是一样的。

可能是什么问题呢?

原文由 Canis Majoris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.2k
2 个回答

您应该在运行容器之前清除 data_volume 并且将执行 sql 文件。 此卷 data_volume 可以使用以下命令删除: docker volume rm data_volume

您的问题的根本原因可以在 docker-entrypoint.sh 中找到。当您运行 mysql 容器时,它会检查 mysql 目录 /var/lib/mysql 存在。如果该目录不存在(第一次运行),它将运行您的 SQL 文件。

     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 源 获得更多详细信息

原文由 Ricky 发布,翻译遵循 CC BY-SA 4.0 许可协议

所以我几个小时都遇到了同样的问题,然后决定研究 docker-entrypoint.sh。事实证明,该脚本检查 $DATADIR/mysql,典型的 /var/lib/mysql 并在 datadir 存在时跳过其余代码,包括。 docker-entrypoint-initdb.d

所以我所做的是制作一个简单的 init.sh 文件来删除 datadir 然后启动 docker。

码头工人-compose.yml:

 volumes:
  - ./docker/mysql/scripts:/docker-entrypoint-initdb.d
  - ./mysql_data:/var/lib/mysql

初始化.sh:

 #!/bin/bash
rm -rf mysql_data
docker-compose up --force-recreate

当然,一旦我看到它按预期工作,就将 -d 添加到 docker-compose

原文由 Kim Lundberg Stegenborg Madsen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题