Запуск служб после развертывания службы MariaDB с помощью Docker Compose

Ключ depends_on в docker-compose.yml может установить порядок запуска каждой службы, например, запуск службы Node.js после запуска службы MariaDB. Однако он не может контролировать порядок запуска служб после развертывания зависимой службы, как показано в примере NG на рисунке ниже. Например, в случае использования MariaDB (базы данных, аналогичной MySQL), это означает, что Docker запускает любые службы, не дожидаясь завершения инициализации MariaDB, например, создание таблиц, если вы просто установите ключи depends_on.
В этой статье показан способ запуска службы Node.js после развертывания службы MariaDB в качестве примера запуска служб после развертывания зависимой службы с помощью Docker Compose.
На следующем рисунке показано сравнение порядка запуска служб между использованием только ключа depends_on и методом данной статьи.

Исходный код

Этот пример исходного кода был сделан на основе исходного кода, который snowcait рассказал мне в обсуждении этой оригинальной статьи (написанной на японском языке). Я благодарю snowcait за то, что он подал мне эту идею.
В качестве важных замечаний, вы должны ввести имя пользователя и пароль, инициализированные в /docker-entrypoint-initdb.d, в команду test в ключе healthcheck, если вам нужно, чтобы Docker ждал окончания выполнения скрипта в /docker-entrypoint-initdb.d перед запуском Node.js. Лучше сделать код для доступа к новой таблице, которая была сделана в скрипте /docker-entrypoint-initdb.d, если вы делаете только некоторые таблицы, не делая других.

.github/workflows/test.yml

name: Actions Test

on:
  push:
    branches:
      - dev-*

jobs:
  sandbag_test:
    runs-on: ubuntu-20.04
    timeout-minutes: 5
    env:
      MARIADB_ROOT_PASSWORD: ${{secrets.MARIADB_ROOT_PASSWORD}}
      MARIADB_DATABASE: ${{secrets.MARIADB_DATABASE}}
      MARIADB_WEB_USER: ${{secrets.MARIADB_WEB_USER}}
      MARIADB_WEB_PASSWORD: ${{secrets.MARIADB_WEB_PASSWORD}}
      MARIADB_API_USER: ${{secrets.MARIADB_API_USER}}
      MARIADB_API_PASSWORD: ${{secrets.MARIADB_API_PASSWORD}}
      MARIADB_PORT: ${{secrets.MARIADB_PORT}}
      DB_HOST: ${{secrets.DB_HOST}}
      WEB_PORT: ${{secrets.WEB_PORT}}

    steps:
      - uses: actions/checkout@v2

      - name: Shutdown MariaDB
        run: sudo service mysql stop

      - name: Run docker-compose
        shell: bash
        run: |
          touch .env
          docker-compose -v
          docker-compose up --build --abort-on-container-exit
        working-directory: ./
Вход в полноэкранный режим Выйти из полноэкранного режима

docker-compose.yml

version: '3'
services:
  mariadb:
    image: mariadb:10.7
    container_name: sandbag_mariadb
    environment:
      - MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
      - MARIADB_DATABASE=${MARIADB_DATABASE}
      - MARIADB_USER=${MARIADB_WEB_USER}
      - MARIADB_PASSWORD=${MARIADB_WEB_PASSWORD}
      - MARIADB_API_USER=${MARIADB_API_USER}
      - MARIADB_API_PASSWORD=${MARIADB_API_PASSWORD}
      - MARIADB_HOST=%
    tty: true
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    networks:
      - datastream
    healthcheck:
      test: ["CMD", "mariadb", "-u${MARIADB_API_USER}", "-p${MARIADB_API_PASSWORD}", "-e", "use ${MARIADB_DATABASE}"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 5s
  web:
    env_file:
      - .env
    build:
      context: ./web/.
      dockerfile: "Dockerfile"
    ports:
      - ${WEB_PORT}:${WEB_PORT}
    depends_on:
      mariadb:
        condition: service_healthy
    command: ["npm", "test"]
    volumes:
      - ./volume/log/web:/usr/src/logger/web
    networks:
      - datastream
networks:
  datastream:
Войти в полноэкранный режим Выход из полноэкранного режима

Результат выполнения исходного кода

Вы можете проверить результат выполнения этого исходного кода по следующему URL.

https://github.com/KASHIHARAAkira/actions-playground/runs/6634973345?check_suite_focus=true

Благодарность

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


Эта оригинальная статья является следующей, написанной мной. Это перевод части этой оригинальной статьи с японского на английский.

docker composeでMariaDBの起動を待ちNode.jsを起動する

zenn.dev

Оцените статью
Procodings.ru
Добавить комментарий