恒例のドジなハマりシリーズです。相変わらずこういうハマり方をしています。
Dockerでウェブサービスとかを開発するとき、DBサーバーなどの依存サービスが立ち上がるまでアプリケーションサーバーをwait-forなどで待機、という使い方をすることがあると思います。そこで無駄にハマったのでメモしておきます。
症状
アプリケーションサーバーはdebian-slimイメージをベースに構築し、DBサーバーはMariaDBイメージを使っています。
アプリケーションサーバーはDBサーバーに依存しているので、docker-entrypoint.sh
でwait-for
スクリプトを呼び出し、3306ポートを待機しています。
すると、DBサーバーが起動しているにも関わらず、wait-for
はその起動を検知できずタイムアウトしてしまいました。
原因
-
wait-for
スクリプトではnc
コマンド(netcat)を使っている - debian-slimイメージにはnetcatが入っていない
あとはわかるな?
なかなか原因が掴めなかった理由は3つ。
1つ目は、使っていたwait-forのコードは初期のもので、nc
コマンドが入っていなくてもエラーを出さずにそのまま処理を継続(その結果タイムアウト)していたこと。
2つ目は、それまではアプリケーションサーバーがalpineイメージをベースに作っていて、Alpine
LinuxではBusyBoxベースのnc
コマンドがすでにインストールされていたこと。
3つ目は、ワイが単にドジだったこと。
0 件のコメント:
コメントを投稿