Diary

Diary

日々学んだことをアウトプットする場として初めてみました

MySQL のコンテナの起動を正しく待つ

CI 中など、コンテナが起動し MySQL のサーバーが起動されたか確認したい場合があります。

その目的のため mysqladmin コマンドを使っていたのですが、思ったように起動完了しておらず、次のステップで落ちてしまったことがあったのでその共有です。

原因 & 解決策

mysql のコンテナは起動時に "temporary server" を立ち上げて、その後自分で設定した mysql のサーバーのが起動するっぽいです。

後者のサーバーにのみ network interface が割り当てられるので、protocol を tcp に指定すると確定で後者の起動が確認できます。

# protocol を指定しないと "temporary server" 側にアクセスされてしまう。
mysqladmin ping -hlocalhost --silent --protocol tcp

コンテナの起動方法

compose.yml

services:
  db:
    image: "mysql:8.0"
    restart: always
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_USER: mysql_user
      MYSQL_PASSWORD: mysql_password
      MYSQL_DATABASE: app
    ports:
      - "43306:3306"

コンテナの起動確認

docker compose up -d db
# --protocol tcp をつける。
docker compose exec db bash -c 'while ! mysqladmin ping -hlocalhost --silent --protocol tcp; do sleep 1; done'