2020年8月13日木曜日

docker-compose でデータベースなどの起動を待つには wait-for-it スクリプトを使おう

概要

公式にもあるのですが 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 件のコメント:

コメントを投稿