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 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
不执行当前目录下的文件。 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
还将删除过期的容器和当前未使用的图像。
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 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
不执行当前目录下的文件。 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
还将删除过期的容器和当前未使用的图像。