当前位置: 首页 > 面试题库 >

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

弘和同
2023-03-14
问题内容

我正在尝试在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,结果是相同的。

可能是什么问题呢?


问题答案:

在运行容器之前,请先将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 db容器在创建时自动用数据集填充数据库。根据mariadb留档,卷中有一个文件夹可用于此目的。 我设置了我的文件来镜像我在StackOverflow上找到的示例,但是仍然无法执行我的SQL脚本。以下是我的文件的相关部分: 在文件,我有一个文件: 在每次测试迭代之前,我会清理所有旧的/缓存的Docker内容: 我发现这实际上并没有删除数据库卷。运行仍会显示过去存在的卷 Do

  • 按照在CMD之前执行脚本的建议(我需要在容器重新启动之前清除一个临时dir,以修复一个bug),我将docker文件从使用CMD修改为entrypoint,如下所示: 并且在入口点文件中,在rm-rf命令之后结束: 但是docker无法启动容器,它退出,容器日志显示:

  • 我发现了docker入口点initdb。请参阅MySQL文档“如何使用此映像”中的“初始化新实例”部分。但当我在包含docker compose的目录中运行docker compose up时。下面的yml文件,我的数据库未初始化。 我确认了目录包含一个名为的文件。我确认清空目录并运行后,创建了数据库。但是数据库没有填充,除非我在Adminer中手动执行脚本。(我单击“导入”,然后选择文件并按执行

  • 为什么clonenode脚本不在firefox中执行。它在铬合金中工作良好? <代码> 我通过将替换为 原因又能是什么呢?

  • 问题内容: 我正在尝试设置一个mysql docker容器并执行init sql脚本。不幸的是SQL脚本没有执行。我究竟做错了什么? 我执行文件 问题答案: 许多容器化的应用程序,尤其是有状态的应用程序,都有一种运行脚本的方式(例如此处的sql脚本), 并且 它们只能运行 一次 。 并且由于它们是有状态的,因此对于容器是否在容器重新启动时运行脚本而言,卷是事实的来源。 与您的情况类似,删除用于绑定

  • 如何让bash脚本查看设置在.env和/或docker-compose-yaml中的env变量? . env docker-compose.yml entrypoint.sh