概要
公式にもあるのですが wait-for-it を使います
内容はただのシェルスクリプトでポートが LISTEN しているかをチェックしてくれます
環境
- macOS 10.15.6
- docker for mac 19.03.12
- docker-compose 1.26.2
wait-for-it の取得
wget 'https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh'
chmod 755 wait-for-it.sh
docker-compose.yml
今回は version3 フォーマットを使います
version2 であれば healthcheck + condition の組み合わせが使えますが version3 では使えません
vim docker-compose.yml
version: '3'
services:
check:
image: mysql:5
environment:
MYSQL_ROOT_PASSWORD: hogefuga
MYSQL_DATABASE: test
TZ: 'Asia/Tokyo'
volumes:
- ./:/home
command: /home/wait-for-it.sh db:3306 --timeout=30 --strict -- mysqladmin ping -h db -u root -phogefuga
db:
image: mysql:5
environment:
MYSQL_ROOT_PASSWORD: hogefuga
MYSQL_DATABASE: test
TZ: 'Asia/Tokyo'
ports:
- 3306:3306
ポイントは check 側の command
です
wait-for-it.sh db:3306
とすることで db コンテナの 3306 ポートが LISTEN するまで待ちます
ポートが ready になったあとは --
以降のコマンド mysqladmin ping -h db -u root -phogefuga
が実行されます
check 側のコンテナも mysql イメージを使っていますが適当なアプリでも OK です
今回は簡易的な動作確認のために mysql イメージを使っています
動作確認
docker-compose up -d
check コンテナのログを確認しましょう
docker-compose logs -f check
Attaching to downloads_check_1
check_1 | wait-for-it.sh: waiting 30 seconds for db:3306
check_1 | wait-for-it.sh: db:3306 is available after 12 seconds
check_1 | mysqladmin: [Warning] Using a password on the command line interface can be insecure.
check_1 | mysqld is alive
downloads_check_1 exited with code 0
ちゃんと waiting してポートの監視をしていることがわかります
最終的に「mysqld is alive」になれば OK です
0 件のコメント:
コメントを投稿