Посевные данные в mySQL контейнере после запуска - PullRequest
1 голос
/ 25 февраля 2020

У меня есть требование, когда мне нужно подождать несколько команд, прежде чем я заполняю данные для базы данных:

У меня есть несколько сценариев миграции, которые создают схему в базе данных (эта команда запускается из моего приложения контейнер). После этого я хочу заполнить данные базой данных.

Когда я прочитал, сценарии docker-entrypoint-initdb выполняются при инициализации контейнера. Если к нему подключить свой сценарий seed.sql, данные будут заполнены перед сценариями переноса. (Скрипты Migrate фактически удаляют все таблицы и создают их с нуля). Поэтому заполненные данные теряются.

Как этого добиться? (Я не могу изменить сценарии переноса)

Вот мой docker -compose.yml файл

version: '3'
services:
  app:
    build: .
    # mount the current directory (on the host) to /usr/src/app on the container, any changes in either would be reflected in both the host and the container
    volumes:
      - .:/usr/src/app
    # expose application on localhost:36081
    ports:
      - "36081:36081"
    # application restarts if stops for any reason - required for the container to restart when the application fails to start due to the database containers not being ready
    restart: always
    environment:
      MIGRATE: Y
      <some env variables here>
  config-dev:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 
    volumes:
      # to persist data
      - config-dev-volume:/var/lib/mysql
    restart: always
    # to connect locally from SequelPro
    ports:
      - "1200:3306"
  <other database containers>

Мой Dockerfile для контейнера app имеет следующий ENTRYPOINT

# start the application
ENTRYPOINT /usr/src/app/docker-entrypoint.sh

Вот docker -входная точка. sh file

#!/bin/bash

if [ "$MIGRATE" = "Y" ];
then
    <command to start migration scripts>
    echo "------------starting application--------------"
    <command to start application>
else
    echo "------------starting application--------------"
    <command to start application>
fi

Редактировать: Есть ли способ запустить сценарий в контейнере config-db из docker -entrypoint. sh файл в контейнере приложения?

1 Ответ

2 голосов
/ 25 февраля 2020

Это может быть решено в два шага:

  1. Вам нужно дождаться, пока ваш контейнер БД не будет запущен и готов.

Подождите, пока запуск может быть обработан с помощью добавление зависимость_он в docker -компонентный файл:

version: '3'
services:
  app:
    build: .
    # mount the current directory (on the host) to /usr/src/app on the container, any changes in either would be reflected in both the host and the container
    depends_on:
      - config-dev
      - <other containers (if any)>
    volumes:
      - .:/usr/src/app
    # expose application on localhost:36081
    ports:
      - "36081:36081"
    # application restarts if stops for any reason - required for the container to restart when the application fails to start due to the database containers not being ready
    restart: always
    environment:
      MIGRATE: Y
      <some env variables here>
  config-dev:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 
    volumes:
      # to persist data
      - config-dev-volume:/var/lib/mysql
    restart: always
    # to connect locally from SequelPro
    ports:
      - "1200:3306"
  <other database containers>

Ожидание готовности БД - это другой случай, потому что иногда для запуска процесса БД требуется время прослушивание порта tcp. К сожалению, Docker не предоставляет способ зацепить состояние контейнера. Есть много инструментов и сценариев, чтобы обойти это.

Вы можете go через это реализовать обходной путь. https://docs.docker.com/compose/startup-order/ TL; DR

Загрузите https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh внутри контейнера и удалите поле ENTRYPOINT (Не требуется для вашего варианта использования) и вместо этого используйте поле CMD :

CMD ["./wait-for-it.sh", "<db_service_name_as_per_compose_file>:<port>", "--", "/usr/src/app/docker-entrypoint.sh"]

Теперь, когда это завершено. Следующая часть - выполнить ваш начальный сценарий. sql. Это легко и можно выполнить, добавив следующую строку в ваш / usr / src / app / docker -entrypoint. sh script.

sqlcmd -S -U -P -i inputquery_file_name -o outputfile_name

Поместить указанную выше команду после сценария переноса в /usr/src/app/docker-entrypoint.sh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...