使用docker compose时永远不会执行docker-entrypoint-initdb.d中的文件

Art*_*san 6 docker docker-compose docker-machine

我在Windows 10上使用Docker Toolbox

我可以通过http://192.168.99.100:8000成功访问php部分,我一直在研究mariadb部分,但仍然有一些问题

我有一个sql文件,/mariadb/initdb/abc.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"
Run Code Online (Sandbox Code Playgroud)

rad*_*t81 7

对我来说,问题是 Docker 没有清理我以前运行时安装的卷。

做一个:

docker volume ls
Run Code Online (Sandbox Code Playgroud)

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

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

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

volumes:
   - ./db/:/docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)

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