Могу ли я использовать fig для инициализации постоянной базы данных в докере?

Я пытаюсь автоматизировать установку и запуск набора связанных док-контейнеров, используя рис. Конфигурация состоит из контейнера, на котором работает RStudio, связанного с контейнером, на котором работает MySQL, так что я могу запрашивать базу данных MySQL из RStudio.

При первом запуске я хотел бы создать контейнер MySQL из базового образа MySQL и заполнить его пользователем и базой данных. Из командной строки примерно так:

#Get the latest database file
wget -P /tmp http://ergast.com/downloads/f1db.sql.gz && gunzip -f /tmp/f1db.sql.gz

#Create the database container with user, password and database
docker run --name ergastdb -e MYSQL_USER=ergast -e MYSQL_ROOT_PASSWORD=mrd -e MYSQL_DATABASE=f1db -d mysql

#Populate the database
docker run -it --link=ergastdb:mysql -v /tmp:/tmp/import --rm mysql sh -c 'exec mysql -h$MYSQL_PORT_3306_TCP_ADDR -P$MYSQL_PORT_3306_TCP_PORT -uergast -pmrd f1db < /tmp/import/f1db.sql'

#Fire up RStudio and link to the MySQL db
docker run --name f1djd -p 8788:8787 --link ergastdb:db -d rocker/hadleyverse

Если бы я мог получить образ базы данных с предварительно загруженными данными, я думаю, что-то вроде следующего скрипта fig.yml могло бы связать элементы?

gdrive:
    command: echo created
    image: busybox
    volumes:
        - "~/Google Drive/shareddata:/gdrive"

dbdata:
    image: mysql_preloaded
    environment:
        MYSQL_USER=ergast
        MYSQL_ROOT_PASSWORD=mrd
        MYSQL_DATABASE=f1db 

rstudio:
    image: rocker/hadleyverse
    links:
        - dbdata:db
    ports:
        - "8788:8787"
    volumes_from:
        - gdrive

Мой вопрос в том, могу ли я использовать одноразовый шаг fig для создания контейнера dbdata, а затем, возможно, смонтировать постоянный том, связать его и инициализировать базу данных, предположительно как часть начального fig up. Если я затем запускаю и останавливаю контейнеры, я не хочу снова запускать этап инициализации базы данных, просто свяжусь с контейнером тома данных, который содержит данные, которые я ранее установил.

Я также заметил, что образ докера MySQL выглядит так, как будто он поддерживает произвольные определения datadir (Обновить точки входа для чтения DATADIR напрямую из конфигурации MySQL, а не из /var/lib/docker). Насколько я понимаю, текущее определение образа MySQL предотвращает монтирование (и, следовательно, сохранение) содержимого базы данных в контейнере базы данных. Я предполагаю, что это может позволить создать образ mysql_preloaded, но я не думаю, что последняя версия сценария docker MySQL еще не была отправлена ​​​​в dockerhub, и я не могу придумать, как тогда fig сможет использовать этот альтернативный путь?


person psychemedia    schedule 30.01.2015    source источник


Ответы (2)


Некоторые варианты:

  1. Отредактируйте fig.yml, чтобы запустить пользовательскую команду, отличную от команды/точки входа изображения по умолчанию.

    Из http://www.fig.sh/yml.html (пример): command: bundle exec thin -p 3000

  2. Запустите контейнер локально, измените его, а затем зафиксируйте как новый образ.

  3. Измените файл образа MySQL docker-entrypoint.sh, чтобы выполнить пользовательскую инициализацию.

    https://github.com/docker-library/mysql/blob/567028d4e177238c58760bcd69a8766a8f026e2a/5.7/docker-entrypoint.sh

person ryan1234    schedule 30.01.2015
comment
но зачем настраивать контейнер БД с помощью docker-entrypoint.sh? Разве psychemedia не пытается сохранить контейнер db неуникальным и инициализировать db при запуске или в docker compose/fig лучше? или «команда:» несовместима с «exec mysql...»? - person Tom; 01.06.2015

Не могли бы вы просто развернуть свою собственную версию образа докера MySQL? Официальный файл от MySQL "upstream" доступен по адресу https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile Что, если вы просто сделаете свою собственную копию этого, удалите строку VOLUME (строка 11), а затем вы сможете

docker build -t my_mysql .
docker run -d --name=empty_db my_mysql ...
# add data to the database running in the container
docker commit empty_db primed_db
docker rm -v empty_db

docker run -d --name=instance1 primed_db
docker run -d --name=instance2 primed_db

что должно оставить вас с двумя запущенными «идентичными», но полностью изолированными экземплярами.

person Fredrik Wendt    schedule 08.09.2015