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
そして、それは正常に実行され、イメージを作成します。
以下の質問があります。
Docker-composeを使用する場合、依存するすべてのコンテナーが起動するとすぐにコンテナーが起動すると思います。私のAPIコンテナーが起動する前に、mysqlサーバーが起動して接続を受け入れる準備ができるのを待つ方法はありますか?
アプリケーションとmysqlのコンテナーを個別に作成し、docker-composeを使用しないことを選択した場合、アプリケーションがmysqlコンテナーに確実に接続するようにするにはどうすればよいですか?
これを達成するのに役立つ他のツールはありますか?
注:使用しようとしました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
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コンテナが正常になるまで開始しません