我具有以下设置Docker Composer设置,并希望运行一个shell脚本来自动执行诸如将DB导入MySQL数据库之类的任务。
# Adopt version 2 syntax:
version: '2'
volumes:
database_data:
driver: local
services:
###########################
# Setup the Nginx container
###########################
nginx:
image: nginx:latest
ports:
- 8080:80
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
- php
###########################
# Setup the PHP container
###########################
php:
build: ./docker/php/
expose:
- 9000
volumes:
- .:/var/www
###########################
# Setup the Database (MySQL) container
###########################
mysql:
image: mysql:latest
expose:
- 3306
volumes:
- database_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: project
MYSQL_USER: project
MYSQL_PASSWORD: project
答案 0 :(得分:2)
最好的解决方案是创建一个自定义Dockerfile,该文件扩展mysql
并添加一个自定义的shell脚本,该脚本可以完成您想要的操作。例如:
start.sh
#!/bin/sh
mysqld
mysql -u project -ppropject project < /path/to/backup.sql
别忘了将backup.sql
添加到Dockerfile或docker-compose.yml
现在,Dockerfile:
FROM mysql:latest
COPY start.sh /tmp/start.sh
COPY backup.sql /path/to/backup.sql
CMD ["/tmp/start.sh"]
如果您经常更改backup.sql
,将其添加到Dockerfile中是没有意义的。而是将其放在volumes
中的docker-compose.yml
下:
mysql:
build: .
expose:
- 3306
volumes:
- ./backup.sql:/path/to/backup.sql
- database_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: project
MYSQL_USER: project
MYSQL_PASSWORD: project
答案 1 :(得分:0)
您可以继续使用原始图像:将安装脚本作为配置加载到容器中(使用长格式定义,以便您可以设置执行权限),然后覆盖入口点运行您的脚本(完成后可能应该运行原始入口点脚本)。像这样:
mysql:
image: mysql:latest
expose:
- 3306
volumes:
- database_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: project
MYSQL_USER: project
MYSQL_PASSWORD: project
configs:
- source: ./OverrideScript.sh
target: /OverrideScript.sh
#0777 will work too, but you can't write to it either way
mode: 0555
entrypoint: /OverrideScript.sh
其他答案是正确的,“正确”的方法是制作自己的图像。但是TBH,如果您的替代脚本相对较小且重量轻,则解决方法并不那么糟糕,并且使您不必在每次MySQL发布新映像时都重新构建自定义映像。