Docker - как изменить мой файл Docker Compose для автоматизации bash-скрипта для контейнера MySQL? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующая настройка 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 ]

0 голосов
/ 31 августа 2018

Вы можете продолжать использовать исходное изображение: загрузите сценарий установки в контейнер в качестве конфигурации (используя длинное определение формы, чтобы вы могли установить разрешение на выполнение), а затем переопределите точку входа на запустите ваш скрипт (который, вероятно, должен запустить оригинальный скрипт точки входа после его завершения). Так что-то вроде:

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 выпускает новый образ.

0 голосов
/ 31 августа 2018

Лучшее решение - создать собственный 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
...