恒例のドジなハマりシリーズです。相変わらずこういうハマり方をしています。
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 件のコメント:
コメントを投稿