Docker создает ожидание для инициализации службы базы данных - PullRequest
0 голосов
/ 21 ноября 2018

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

Моим весенним приложениям требуется полная настройка базы данных (т. Е. Все таблицы должны быть созданы и некоторые данные должны быть вставлены в некоторые таблицы).) для начала.

Я использую Docker версия 18.09.0 и docker-compose версия 1.23.1 и ubuntu 16.04 LTS


У меня есть два файла create.sql и insert.sql, которые я использую для инициализациибаза данных, которая будет использоваться приложением.

Я создаю изображения с помощью команды docker-compose.yml, и она успешно выполняется и создает изображения.

У меня есть следующиеВопросы.

  1. Я предполагаю, что при использовании docker-compose контейнер запускается сразу после запуска всех зависимых контейнеров.Можно ли подождать, пока сервер mysql будет готов и готов к приему подключений, прежде чем мой контейнер API будет запущен?

  2. Если я решил создать контейнеры отдельно для приложений и mysqlи не использовать docker-compose, как мне убедиться, что мои приложения подключены к контейнеру mysql?

  3. Есть ли какой-нибудь другой инструмент, который может помочь мне достичь этого?

Примечание: Я пытался использовать docker inspect <container_id>, чтобы найти IpAddress для контейнера mysql и использовать его для подключения, но это не такработать также.


Ниже приведены файлы, которые я использую для создания изображений.

docker-compose.yml файл.

version: '3'

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root

  demo-api:
    image: demo-api-1.0
    build: ./api
    depends_on:
      - demo-mysql
    ports:
      - 8080:8080
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

  demo1-app:
    image: demo1-app-1.0
    build: ./demo1
    depends_on:
      - demo-mysql
    ports:
      - 8090:8090
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

Ниже приведен Dockerfile для проекта весенней загрузки

FROM java:8

VOLUME /tmp

ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080

EXPOSE ${APP_PORT}

ADD /build/libs/demo-api.jar demo-api.jar

ENTRYPOINT ["java","-jar","demo-api.jar"]

Ниже приведен Dockerfile, который я использовал для создания своего изображения mysql

FROM mysql:5.7

ENV MYSQL_DATABASE=demo \
    MYSQL_USER=root \
    MYSQL_ROOT_PASSWORD=root

ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d

EXPOSE 3306

1 Ответ

0 голосов
/ 21 ноября 2018

Используйте функцию healthcheck в docker-compose (https://docs.docker.com/compose/compose-file/#healthcheck). Примерно так:

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root
    healthcheck:
      test: ["CMD-SHELL", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

Зависимые контейнеры не запустятся, пока контейнер demo-mysql не исправен

...