【发布时间】:2016-05-04 09:49:34
【问题描述】:
mysql docker 镜像的文档说:
第一次启动容器时 [...] 它将执行 /docker-entrypoint-initdb.d 中的扩展名为 .sh 和 .sql 的文件。您可以通过将 SQL 转储安装到该目录中轻松填充您的 mysql 服务,并提供带有贡献数据的自定义图像。
所以一开始我是在我的docker-compose.yml:
version: '2'
services:
db:
image: mysql:5.7
volumes:
- .:/docker-entrypoint-initdb.d:ro
当我运行docker-compose build 和docker-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 build 和 docker-compose up 并尝试运行我的应用程序时,当前目录中的 *.sql 文件不会执行。我的表都没有创建。
为什么我的第二种方法不起作用?
编辑: 啊,等等。我问错了问题。问题不在于第二种方法不起作用,而在于第二种方法在 Virtualbox 中运行的本地 docker-machine 上运行时不起作用。当我在主机上使用第二种方法时(即不使用 docker-machine),第二种方法实际上有效。
【问题讨论】:
-
您可以发布容器第一次运行时的日志吗?你所拥有的看起来不错,它可能很简单。
-
啊,等等。我问错了问题。问题不在于第二种方法不起作用,而在于第二种方法在Virtualbox中运行的本地
docker-machine上运行时不起作用。当我在主机上使用第二种方法时(即不使用docker-machine),第二种方法实际上有效。 -
好的,你能更新一下问题吗,看看日志,看看发生了什么,还是不错的。它只会在容器第一次启动时运行 .sql 脚本,所以如果你在第一次运行后添加了脚本,它们将不会运行。
-
我发现了问题。问题是我认为
docker-compose rm -f破坏了附加到容器的所有卷,但我错了。所以我认为第一个up:ed 容器实际上使用的是由更早的up创建的数据库。所以 sql 文件没有运行,因为它实际上不是容器第一次启动。呃。感谢 Ken 为我指明了正确的方向。 -
撰写的有趣行为。我相信 -v 旨在删除与 compose 容器关联的所有卷(如果它们是由 compose 创建的)。这是一个错误 Ken 还是 -v 只删除“命名”容器?
标签: mysql docker docker-compose docker-machine