LoginSignup
44
30

More than 5 years have passed since last update.

dockerize を使って他のコンテナ内サービス起動を待つ

Last updated at Posted at 2017-08-03

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 みたいな感じで起動待ちできます.

既存イメージにちょっと足すだけで厄介な起動順番の問題が解消できるので
試してみてはいかがでしょうか.

44
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
30