【发布时间】:2017-02-08 15:37:15
【问题描述】:
我正在尝试使用 docker(-compose) 使我的开发过程更容易/可维护。 我不想使用任何卷(如果可能的话)。 为什么我运行 'docker-compose up -d' 后 import.sh 没有被执行?
我有以下文件:
docker-compose.yml
mysql
---- import.sh
---- db.sql
---- Dockerfile
在 docker-compose.yml 中有:
version: '2'
services:
database:
image: mysql
build:
context: ./mysql/
dockerfile: Dockerfile
container_name: mysqltest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
在/mysql/Dockerfile中有:
ADD import.sh /tmp/import.sh
ADD db.sql /tmp/db.sql
RUN /tmp/import.sh
在/mysql/db.sql中有:
CREATE DATABASE test1;
CREATE DATABASE test2;
CREATE DATABASE test3;
【问题讨论】:
-
镜像在构建时运行。 Docker Compose 会在运行之前为您构建镜像。所以你的脚本应该在运行
docker-compose up -d之前运行,而不是之后。 -
听起来您只是希望您的数据库转储在 mysql 守护程序启动之后运行。在这种情况下,请使用
/docker-entrypoint-initdb.d,记录在MySQL Dockerhub Page 上并在此处解释:stackoverflow.com/questions/36781984/…(Postgres 和 MySQL 的功能相同)。 -
是的,这就是我想要实现的目标,它对我有用,谢谢。但是如果我想在构建过程之后/当所有容器都准备好时运行其他脚本呢?
-
fzgregor 下面的答案解释了最好的方法。
-
只是对@mkasberg 巧妙建议的一点补充,
/docker-entrypoint-initdb.d解决方案中的脚本将仅在容器的新启动时执行(即,如果您使用命名卷来持久化已包含数据库文件的数据,脚本将被忽略)。您可能会找到关于此here 的好帖子
标签: mysql docker docker-compose