我正在尝试在docker-compose.yml文件执行期间创建一个mysql数据库模式
version: "2"
services:
web:
build: docker
ports:
- "8080:8080"
environment:
- MYSQL_ROOT_PASSWORD=root
mysql:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
ports:
- "3306:3306"
links:
- web
onrun:
command: "docker exec -i test_mysql_1 mysql -uroot -proot test <dummy1.sql"
我试过onrun,但这不起作用。 我正在构建第一张图片,但从docker hub中拉出第二张图片。 请在docker-compose up
之后帮助您完成以下命令答案 0 :(得分:17)
onrun
中没有docker-compose
。它只会调出容器并执行命令。现在你有几个可能的选择
使用mysql图像初始化
mysql:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
volumes:
- ./dummy1.sql:/docker-entrypoint-initdb.d/dummy1.sql
ports:
- "3306:3306"
您可以将容器内的/docker-entrypoint-initdb.d
内的sql文件
使用bash脚本
docker-compose up -d
# Give some time for mysql to get up
sleep 20
docker-compose exec mysql mysql -uroot -proot test <dummy1.sql
使用其他泊坞窗服务初始化数据库
version: "2"
services:
web:
build: docker
ports:
- "8080:8080"
environment:
- MYSQL_ROOT_PASSWORD=root
mysql:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
ports:
- "3306:3306"
mysqlinit:
image: mysql:latest
volumes:
- ./dummy1.sql:/dump/dummy1.sql
command: bash -c "sleep 20 && mysql -h mysql -uroot -proot test < /dump/dummy1.sql"
您运行的另一项服务将为您启动数据库,例如上面的mysqlinit
答案 1 :(得分:3)
首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh,.sql和.sql.gz的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。
来自https://hub.docker.com/_/mysql/
这是在容器创建时初始化自己的数据库(postgresql,mysql,...)的便捷方式。您应该创建一个* .sql / * .sh文件并通过 volume 将其绑定到新容器中:
db:
image: mysql:latest
volumes:
- ./db/entrypoint:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=iamgroot
- MYSQL_DATABASE=gotg
这会将所有sql / sh文件加载到容器中,然后自动执行。