web-dev-qa-db-ja.com

テストコンテナーの終了時にdocker composeを終了する

現在、分度器テストランナー、Webページを提供するnodejsサーバー、およびJavaバックエンドを提供するwildflyサーバー)との基本的な統合テストのためにdocker-composeスタックを実行しています。

スタックは、ビルドサーバー(コンコースci)のdind(dockerのドッカー)コンテナから実行されます。

しかし、分度器のテストを終了してもコンテナは終了しないようです。

だから、wildflyのコンテナとnodejsはまだ実行されているので、ビルドタスクは決して終了しません...

テストが終了したときに成功または失敗で構成を終了させるにはどうすればよいですか?

# Test runner
test-runner:
  image: "${RUNNER_IMG}"
  privileged: true
  links:
    - client
    - server
  volumes:
  - /Users/me/frontend_test/client-devops:/protractor/project
  - /dev/shm:/dev/shm
  entrypoint:
    - /entrypoint.sh
    - --baseUrl=http://client:9000/dist/
    - /protractor/conf-dev.js
    - --suite=remember
# Client deployment
client:
  image: "${CLIENT_IMG}"
  links:
    - server
# Server deployment
server:
  image: "${SERVER_IMG}"
25
David Karlsson

この rspec q/a と同様に、終了ステータスをCIに報告するスタンドアロンタスクとしてテストを実行する必要があります。

テストランナーを独自のyamlに分離するか、テストランナーをデフォルトでno opコマンド/エントリポイントに変更することができます。

テストランナーを分離する

test-runner configを個別に設定します(複数の構成ファイル間で作業するには、networksを使用する代わりに バージョン2 links にアップグレードする必要があります)。

docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc

運用テストランナーなし

デフォルトはtest-runner no opエントリポイント/コマンドに移動してから、テストコマンドを手動で実行します

services:
  test-runner:
    image: "${RUNNER_IMG}"
    command: 'true'

それから

docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc

リターンコード

CIに「タスク後」の概念がある場合、rcキャプチャをスキップして、単にdocker-compose downテストランナーCIタスクが完了した後。 CIがコンテナをクリーンアップすることも可能です。

16
Matt

これらのdocker-composeパラメーターを使用して、それを実現できます。

--abort-on-container-exitコンテナが停止した場合、すべてのコンテナを停止します。

--exit-code-from選択したサービスコンテナの終了コードを返します。

たとえば、このdocker-compose.yml

version: '2.3'

services:
  elasticsearch:
    ...
  service-api:
    ...
  service-test:
    ...
    depends_on:
      - elasticsearch
      - service-api

次のコマンドは、service-apiの終了後にelasticsearchおよびservice-testが確実に停止し、service-testコンテナから終了コードを返すようにします。

docker-compose -f docker-compose.yml up \
    --abort-on-container-exit \
    --exit-code-from service-test
50
Michael Spector

最もエレガントであることがわかった解決策は、depends_onあなたのdocker-compose.ymlファイル。

services:
  dynamodb:
  ...
  test_runner:
    ...
    depends_on:
      - dynamodb

これで、docker-compose run --rm test_runner依存関係を設定し、テストを実行し、すべてを破棄し、リターンコードを伝播します。

docker-compose run test_runner false
Starting test_dynamodb_1 ... done
echo $?
1
docker-compose run test_runner true
Starting test_dynamodb_1 ... done
echo $?
18
wonton

私はこの議論で提供された解決策を試しましたが、まだ問題があります

ケース-1:docker-compose up -d

docker-compose up -dを使用し、test-runnerでテストしてからdocker-compose downで終了できますが、docker-compose up -dを使用した場合の問題は標準出力のログはもう表示されません。

ケース-2:docker-compose up --exit-code-from a service

ドッカーのログを表示する--exit-code-from <service>を意味する--abort-on-container-exitを使用しているが、サービスが終了コマンドを送信しない場合成功します。その後、キャッチする必要がありますdocker-compose downを送信する前にコンテナがテストされていることを停止します。

解決策の1つ ログを表示する ログを終了する前に--tail=1000 -fを使用する

docker-compose up -d
docker-compose logs --tail=1000 -f test-runner
docker-compose down
exit $rc

Nohupを使用したソリューションもありますが、プロセスが完全に完了するまで待ってから出力ログファイルを開く必要があるため、上記の方が簡単です。

0
Chetabahana

個別の設定ファイルを避けるため、docker-compose設定を更新して、 depends_on オプションでサービス間の依存関係を導入できます。バージョン2以降のバージョンで利用可能です。結果として、test-runnerは、クライアントの実行を開始します。

テスト中のサービスから実際のWebサーバーが開始されるまでしばらく待つ必要がある場合は、 wait-for-it.sh スクリプトを使用して、サーバーが使用可能になるまで待つことができます。 。

# Test runner
test-runner:
  image: "${RUNNER_IMG}"
  privileged: true
  links:
    - client
    - server
  volumes:
  - /Users/me/frontend_test/client-devops:/protractor/project
  - /dev/shm:/dev/shm
  depends_on:
    - client
  entrypoint:
    - wait-for-it.sh
    - client
    - -t
    - '180'
    - --
    - /entrypoint.sh
    - --baseUrl=http://client:9000/dist/
    - /protractor/conf-dev.js
    - --suite=remember
# Client deployment
client:
  image: "${CLIENT_IMG}"
  depends_on:
    - server
  links:
    - server
# Server deployment
server:
  image: "${SERVER_IMG}"

設定を更新した後、簡単なdocker-compose up test-runnerは、関連するサービスの開始をトリガーします。

0
Andriy Ivaneyko