Docker 扩展 mysql 图像的图像不是 运行 initdb 脚本

Docker image extending the mysql image isn't running the initdb scripts

mysqldocker 图像的文档说:

When a container is started for the first time [...] it will execute files with extensions .sh and .sql that are found in /docker-entrypoint-initdb.d. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data.

所以起初我在 docker-compose.yml:

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - .:/docker-entrypoint-initdb.d:ro

当我 运行 docker-compose builddocker-compose up 容器被创建并且执行当前目录中的 sql 文件。目前一切顺利。

但是如果我想将这些容器部署到另一台机器上(使用 docker-machine),安装 /docker-entrypoint-initdb.d 作为卷将不起作用,因为那台机器无法访问我机器的. 目录。

然后我尝试扩展 mysql:5.7 图像:

FROM mysql:5.7
COPY ./*.sql /docker-entrypoint-initdb.d/

然后在我的 docker-compose.yml

中执行此操作
version: '2'
services:
  db:
    build:
      context: .
      dockerfile: Dockerfile

然而,当我在第二台机器上 运行 docker-compose builddocker-compose up 并尝试 运行 我的应用程序时, *.sql 不执行当前目录下的文件。 None 个表格已创建。

为什么我的第二种方法不起作用?

编辑: 啊,等等。我问错了问题。问题不是第二种方法不起作用,而是第二种方法在 Virtualbox 中 运行 在本地 docker-机器上 运行ning 时不起作用。当我在主机上使用第二种方法时(即不使用 docker-machine),第二种方法实际上有效。

我发现了问题。问题是我认为 docker-compose rm -f 破坏了容器上附加的任何卷,但我错了。所以我认为第一个 up:ed 容器实际上使用的是之前创建的数据库。所以 sql 文件不是 运行 因为它实际上不是容器第一次启动。呃。感谢 Ken 为我指明了正确的方向。

事实证明,即使不使用 docker-compose rm -v 也无法删除卷。我不得不用 docker volume ls 列出它们,然后用 docker volume rm <volume>.

手动删除它们

清理卷的另一种Docker-specific方法:

docker system prune

这将删除悬挂图像、容器、卷和网络。添加 -a 还将删除过期的容器和当前未使用的图像。