使用Docker Compose时,docker-entrypoint-initdb.d中的文件不会被执行

9
我在Windows 10上使用Docker Toolbox。 我可以成功访问php部分,网址为http://192.168.99.100:8000。我一直在处理mariadb部分,但仍然存在若干问题。 我有一个名为/mariadb/initdb/abc.sql的sql文件,所以我应该将它复制到/docker-entrypoint-initdb.d,创建容器后,我使用docker-compose exec mariadb来访问容器,这个文件会出现在/docker-entrypoint-initdb.d/abc.sql中,但是该文件从未被执行过。我也尝试手动导入sql文件到容器中,成功了,说明sql文件是有效的。 我不太理解数据文件夹映射,并且不知道如何使文件夹与容器同步,每次使用docker-compose up -d重新创建容器时,我总是收到以下警告信息: WARNING: Service "mariadb" is using volume "/var/lib/mysql" from the previous container. Host mapping "/.../mariadb/data" has no effect. Remove the existing containers (with docker-compose rm mariadb) to use the Recreating db ... done 问题: 1. 如何执行/docker-entrypoint-initdb.d中的sql文件? 2. 映射数据文件夹与mariadb容器的正确方法是什么? 请指导,谢谢。 这是我的docker-compose.yml文件。
version: "3.2"
services:
    php:
        image: php:7.1-apache
        container_name: web
        restart: always
        volumes:
            - /.../php:/var/www/html
        ports:
            - "8000:80"
    mariadb:
        image: mariadb:latest
        container_name: db
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=12345
        volumes:
            - /.../mariadb/initdb:/docker-entrypoint-initdb.d
            - /.../mariadb/data:/var/lib/mysql
        ports:
            - "3306:3306"
2个回答

7
对我来说问题在于Docker没有清理之前运行挂载的卷。

执行以下命令:

docker volume ls

将列出所有卷,并如果先前存在,则在卷上运行“rm”命令以删除它。

如在docker mysql docks中所述,“/docker-entrypoint-initdb.d”文件夹中的脚本仅在容器第一次运行时进行评估,如果先前存在卷,则不会运行脚本。

至于映射,您只需要将脚本文件夹挂载到镜像中的“/docker-entrypoint-initdb.d”文件夹即可:

volumes:
   - ./db/:/docker-entrypoint-initdb.d

我有一个单独的脚本文件,放在名为db的文件夹中,与我的docker-compose文件相对应。


0
在创建mariaDB的Docker文件中,最后像这样将abc.sql文件添加到您的docker入口点:
COPY abc.sql /docker-entrypoint-initdb.d/

移除 - /.../mariadb/initdb:/docker-entrypoint-initdb.d 的映射,因为任何复制到入口点的文件都将被执行。

注意:Windows 容器不会执行 docker-entrypoint-initdb.d/ 中的任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接