docker-compose では depends_on によってコンテナの起動順をある程度
制御することができます.
ただし depends_on が保証するのはコンテナの起動順だけでコンテナ内の
サービスの準備が完了するまでは待ってくれません.
参考: http://docs.docker.jp/compose/startup-order.html
現在, docker-compose にて APP + DB の構成に k6 を追加して手軽に
負荷試験もできるようにしようとしたのですが, k6 の実行が APP のサービス
準備完了後にならず試験の最初の方がアクセスエラーが発生してしまいました.
そこで上記サイトでも紹介されている dockerize を使用しました.
(ネット上で検索すると環境を docker 化するのを dockerize と呼んでいる
ところがあるので情報は転がってそうでなかったです)
dockerize は docker のコンテナ動作に関するユーティリティーモジュールです.
コンテナにて使用するにはイメージに dockerize を含める必要があります.
ということで今回作成した k6 イメージビルドする Dockerfile です.
dockerize: https://github.com/jwilder/dockerize
k6: https://github.com/loadimpact/k6
FROM loadimpact/k6:0.17.0
ENV DOCKERIZE_VERSION v0.5.0
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash \
&& apt-get install -y \
wget \
&& wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& apt-get purge -y --auto-remove wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ENTRYPOINT []
k6 のベースイメージ指定以外が dockerize のインストールです.
次に docker-compose を使って APP のサービス起動を待ちつつ k6 でテストをやってみます.
docker-compose run -p 6565:6565 --rm k6 dockerize -wait http://hogehoge:80/healthcheck k6 run k6_test.js
dockerize -wait <<待つ対象サービスのURL>> <<コマンド>>
http の場合は 200 ok が返るまで対象 URL を叩き続けます.
なのでそういった API も実装しておく必要があります.
ちなみに mysql の場合は tcp://mysql:3306 みたいな感じで起動待ちできます.
既存イメージにちょっと足すだけで厄介な起動順番の問題が解消できるので
試してみてはいかがでしょうか.