mysql - 扩展 mysql 镜像的 Docker 镜像未运行 initdb 脚本

标签 mysql docker docker-compose docker-machine

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 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 机器上运行时不起作用。当我在主机上使用第二种方法时(即不使用 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/

相关文章:

ruby-on-rails - 无法在 docker 中以守护进程模式运行 puma

postgresql - 在 Docker 容器内运行 `mkdir` 时权限被拒绝

docker - 如何使用 Docker Swarm 模式或 Docker Compose 部署 IPv6 容器

mysql - MySQL 唯一键/索引使用什么数据类型

docker - VPN可扩展性测试客户端设置的问题

mysql 连接问题 - 我这样做对吗

git - 如何在 docker ubuntu 镜像上安装 git?

bash - Docker 容器启动命令未获取 .bashrc 变量

php - 如何编辑带有复选框的表单并在数据库端反射(reflect)更改

Mysql:前缀索引与索引