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

问题描述 投票:0回答:2

我在 Windows 10 上使用 Docker Toolbox。

我可以通过http://192.168.99.100:8000成功访问php部分,我一直在处理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"
docker docker-compose docker-machine
2个回答
7
投票

对我来说,问题在于 Docker 没有清理之前运行中安装的卷。

做一个:

docker volume ls

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

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

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

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

相对于我的 docker-compose 文件,我在名为 db 的文件夹中有一个脚本文件。


0
投票

在用于创建 mariaDB 的 Docker 文件中,最后将 abc.sql 文件添加到 Docker 入口点,如下所示:

COPY abc.sql /docker-entrypoint-initdb.d/

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

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

© www.soinside.com 2019 - 2024. All rights reserved.