mysql 的文档 docker 图像说:
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 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 机器上运行时不起作用。当我在主机上使用第二种方法时(即不使用 docker-machine),第二种方法实际上是有效的。
最佳答案
我发现了这个问题。问题是我认为 docker-compose rm -f
销毁了容器上附加的所有卷,但我错了。所以我认为第一个 up:ed 容器实际上使用的是早期 up 创建的数据库。因此 sql 文件没有运行,因为这实际上不是容器第一次启动。呃。感谢肯为我指明了正确的方向。
事实证明,甚至没有使用 docker-compose rm -v
删除卷。我必须用 docker volume ls
列出它们然后使用 docker volume rm <volume>
手动删除它们.
关于mysql - 扩展 mysql 镜像的 Docker 镜像未运行 initdb 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37024179/