扩展mysql映像的Docker镜像不运行initdb脚本

时间:2016-05-04 09:49:35

标签: mysql docker docker-compose docker-machine

mysql泊坞窗图片的文档说明:

  

第一次启动容器时,它将执行扩展名为.sh和.sql的文件,这些文件位于/docker-entrypoint-initdb.d中。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充您的mysql服务。

首先,我在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个文件不是执行即可。我的表都没有创建。

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

修改 啊,等等。我提出了错误的问题。问题不在于第二种方法不起作用,而是在Virtualbox中运行的本地docker-machine上运行第二种方法时,第二种方法不起作用。当我在我的主机上使用它时(即不使用docker-machine),第二种方法实际上有效。

2 个答案:

答案 0 :(得分:0)

我发现了这个问题。问题是我认为docker-compose rm -f销毁了附在容器上的任何卷,但我错了。所以我认为是第一个:ed容器实际上是使用早期创建的数据库。所以sql文件没有运行,因为它实际上不是容器第一次启动。咄。谢谢Ken指出我正确的方向。

事实证明,即使使用docker-compose rm -v也不会删除卷。我必须使用docker volume ls列出它们,然后使用docker volume rm <volume>手动删除它们。

答案 1 :(得分:0)

另一种特定于Docker的清理卷的方法:

docker system prune

这将删除悬空图像,容器,卷和网络。添加-a也会删除过期的容器和当前未使用的图像。