Docker - как изменить мой файл Docker Compose для автоматизации bash-скрипта для контейнера MySQL?
У меня есть следующая настройка Docker Composer и я хочу запустить скрипт оболочки для автоматизации таких задач, как импорт БД в базу данных 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
2 ответа
Лучшее решение - создать собственный Dockerfile, который расширяет mysql
и добавьте собственный скрипт оболочки, который делает то, что вы хотите. Например:
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
Вы можете продолжать использовать исходное изображение: загрузите сценарий установки в контейнер в качестве конфигурации (используя длинное определение, чтобы вы могли установить разрешение на выполнение), а затем переопределите Entrypoint для запуска вашего сценария (который, вероятно, должен запустить оригинальный сценарий входа после его завершения). Так что-то вроде:
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 выпускает новый образ.