web-dev-qa-db-ja.com

Docker composeはデータベースサービスの初期化を待機します

Dockerを使用してコンテナー化したいSpring Bootプロジェクトがあります。同じMySqlサーバーに接続する2つのSpring Bootアプリケーションがあります。

私の春のアプリケーションでは、開始するためにデータベースを完全にセットアップする必要があります(つまり、すべてのテーブルを作成し、いくつかのデータをいくつかのテーブルに挿入する必要があります)。

私はDocker version 18.09.docker-compose version 1.23.1とubuntu 16.04 LTS


2つのファイルがあるcreate.sqlおよびinsert.sql。アプリケーションで使用するデータベースを初期化するために使用します。

コマンドdocker-compose.ymlそして、それは正常に実行され、イメージを作成します。

以下の質問があります。

  1. Docker-composeを使用する場合、依存するすべてのコンテナーが起動するとすぐにコンテナーが起動すると思います。私のAPIコンテナーが起動する前に、mysqlサーバーが起動して接続を受け入れる準備ができるのを待つ方法はありますか?

  2. アプリケーションとmysqlのコンテナーを個別に作成し、docker-composeを使用しないことを選択した場合、アプリケーションがmysqlコンテナーに確実に接続するようにするにはどうすればよいですか?

  3. これを達成するのに役立つ他のツールはありますか?

注:使用しようとしましたdocker inspect <container_id> mysqlコンテナのIpAddressを検索し、それを使用して接続しますが、同様に機能しません。


以下は、イメージの作成に使用しているファイルです。

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
5
greenPadawan

Docker-composeのhealthcheck機能を使用します( 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コンテナが正常になるまで開始しません

2
Simonluca Landi