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

Can*_*ris 17 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
Run Code Online (Sandbox Code Playgroud)

这是我的script.sql:

CREATE DATABASE mydb;
CREATE DATABASE mydb2;
Run Code Online (Sandbox Code Playgroud)

我构建并运行容器:

$ docker build -t mysql .
$ docker run -v data_volume:/var/lib/mysql --name somedb -d mysql
Run Code Online (Sandbox Code Playgroud)

当我在tty中访问容器时,我可以看到它script.sql/docker-entrypoint-initdb.d但是没有被执行.

我看过docker logs -f somedb输出但是没有错误.

我试过用.sh文件,我也试过用Maria-db,结果是一样的.

可能是什么问题呢?

Ric*_*cky 10

在运行容器之前,请将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 
Run Code Online (Sandbox Code Playgroud)

您可以在Dockerfile源上获取更多详细信息

  • 上面有一个轻微的语言障碍,所以我想添加到这个解决方案中以澄清一点,因为它是正确的:如果mysql数据卷存在,它不会被入口数据库中的SQL覆盖。对我来说,这意味着执行“rm /my/data/volume”,因为它是一次性的。此后,一切都按其应有的方式进行。 (2认同)

小智 8

我对 mariadb 映像(版本:10.4)遇到了完全相同的问题,当我从头开始创建容器时,我通过确保容器数据卷中的任何文件或目录都为空来解决它。

这是我的 docker 撰写文件:

  玛丽亚数据库:
    图片:mariadb:10.4
    重新启动:除非停止
    环境:
      MYSQL_ROOT_PASSWORD:********
    卷:
    - ./storage/db:/var/lib/mysql:rw
    - ./app/db/SQL:/docker-entrypoint-initdb.d/:rw
    端口:
    - 3306:3306/tcp

对我来说,我只需确保此路径:“./storage/db”在文件中为空。请注意,该目录必须存在但为空。

  • 你是如何清空`./storage/db`的? (4认同)

Kim*_*sen 7

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

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

docker-compose.yml:

volumes:
  - ./docker/mysql/scripts:/docker-entrypoint-initdb.d
  - ./mysql_data:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

init.sh:

#!/bin/bash
rm -rf mysql_data
docker-compose up --force-recreate
Run Code Online (Sandbox Code Playgroud)

当然-ddocker-compose一旦我看到它能按预期运行,就添加它。

  • 你在哪里添加了 init.sh 文件? (4认同)
  • 我的 5 美分:请注意,您应该在主机上的 `init.sh` 文件的权限中包含执行 - 否则您可能会收到如下错误:`/docker-entrypoint-initdb.d/init.sh: /usr/ bin/env:错误的解释器:权限被拒绝` (3认同)
  • @GeorgeGeorgitsis:如果 Docker 映像在 /docker-entrypoint-initdb.d 文件夹内找到任何扩展名为 .sh 或 .iql 的文件,它将执行它们。我的情况是 init.sh 它位于 ./docker/mysql/scripts/ 内 (2认同)