Как выполнить одноразовые / менее частые команды с docker -составить - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть docker -композитный файл, который вызывает мое приложение

version: '3'
services:
  web-app:
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - "36081:36081"
    restart: always
    environment:
      MIGRATE: Y
      DB_1_HOST: db1
      DB_1_PORT: 3306
      DB_2_HOST: db2
      DB_2_PORT: 3306
  db1:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/db1/sql-scripts:/docker-entrypoint-initdb.d
      - db1-volume:/var/lib/mysql
    restart: always
    ports:
      - "1200:3306"
  db1:
    image: mysql/mysql-server:5.7
    environment: 
      MYSQL_DATABASE: config_dev
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./docker/images/db2/sql-scripts:/docker-entrypoint-initdb.d
      - db2-volume:/var/lib/mysql
    restart: always
    ports:
      - "1201:3306"

веб-приложение построено из Dockerfile со следующей точкой входа

ENTRYPOINT /usr/src/app/docker-entrypoint.sh

Скрипт docker-entrypoint.sh содержит команды, необходимые для запуска приложения. Тем не менее, у меня есть несколько команд, таких как миграция схемы базы данных и заполнение новых данных (у меня есть сценарии для тех, которые должны запускаться из моего контейнера веб-приложений), которые нужно запускать только один раз или с меньшей частотой, чем другие , Например, разработчик может захотеть запускать скрипт переноса раз в месяц, чтобы учесть любые новые изменения схемы, которые могли произойти. Мое текущее решение для этого - использовать переменную окружения MIGRATE в службе веб-приложений docker-compose.yml и использовать значение переменной в docker-entrypoint.sh, чтобы решить, какую команду запускать. (Если Y, запустите команды переноса вместе с обычными командами запуска, если N - только обычные команды запуска). Я хочу улучшить этот дизайн.

  • Могу ли я создавать собственные docker -композитные команды? (docker-compose up init для миграции и запуска, docker-compose up только для запуска)

  • Есть ли какой-нибудь другой лучший подход для достижения этой цели?

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете docker-compose run произвольную команду в новом контейнере, которая (в основном) совпадает с одним из контейнеров, которые вы описываете в своем файле docker-compose.yml

docker-compose run web-app ./manage.py migrate

. Хитрость заключается в том, что ваш сценарий точки входа должен обязательно выполнить часть «command» команды docker run, которую он получает в качестве аргументов командной строки. Если это сценарий оболочки, он может заканчиваться строкой

exec "$@"

В вашем Dockerfile это означает, что вам нужно указать ENTRYPOINT и значение по умолчанию CMD для запуска. ENTRYPOINT должен использовать форму JSON -array. CMD может быть либо формой JSON, либо пустой строкой.

ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
CMD ./manage.py runserver 0.0.0.0:8000

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

#!/bin/sh
set -e

# Run migrations if requested (possibly in addition to another command)
if [ "$MIGRATE" = "y" ] || [ "$1" = "migrate" ]; then
  ./manage.py migrate
fi

# Run the `command:`, `CMD`, or command-line command
case "$1" of
  migrate)
    # already done above
    exit 0
    ;;
  seed)
    exec ./manage.py loaddata "$@"
    ;;
  *)
    exec "$@"
    ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...