97

現在、Jenkins エージェントは Rails プロジェクトごとに docker-compose.yml を生成し、docker-compose up を実行しています。docker-compose.yml には、rbenv と他のすべての Rails 依存関係を内部に持つメインの「web」コンテナーがあります。これは、テスト Postgres DB を含む DB コンテナーにリンクされています。

問題は、実際にテストを実行して終了コードを生成する必要があるときに発生します。CI サーバーは、テスト スクリプトが exit 0 を返した場合にのみデプロイされますが、コンテナー コマンドの 1 つが失敗した場合でも、docker-compose は常に 0 を返します。

もう 1 つの問題は、Web コンテナーがテストの実行を完了した後でも、DB コンテナーが無期限に実行されるため、docker-compose up戻らないことです。

このプロセスに docker-compose を使用する方法はありますか? コンテナーを実行できるようにする必要がありますが、Web コンテナーが完了したら終了し、終了コードを返します。現在、Docker を使用して手動で DB コンテナーをスピンアップし、 --link オプションを使用して Web コンテナーを実行しています。

4

9 に答える 9

45

docker-compose run希望する終了ステータスを取得する簡単な方法です。例えば:

$ cat docker-compose.yml 
roit:
    image: busybox
    command: 'true'
naw:
    image: busybox
    command: 'false'
$ docker-compose run --rm roit; echo $?
Removing test_roit_run_1...
0
$ docker-compose run --rm naw; echo $?
Removing test_naw_run_1...
1

または、デッド コンテナーを検査するオプションがあります。-fフラグを使用して、終了ステータスのみを取得できます。

$ docker-compose up
Creating test_naw_1...
Creating test_roit_1...
Attaching to test_roit_1
test_roit_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
$ docker-compose ps -q | xargs docker inspect -f '{{ .Name }} exited with status {{ .State.ExitCode }}'
/test_naw_1 exited with status 1
/test_roit_1 exited with status 0

返されない db コンテナーについては、使用する場合は、docker-compose upそのコンテナーを sigkill する必要があります。それはおそらくあなたが望むものではありません。代わりに、docker-compose up -dデーモン化されたコンテナーを実行し、テストの完了時にコンテナーを手動で強制終了するために使用できます。docker-compose run リンクされたコンテナを実行する必要がありますが、現在意図したとおりに機能しないバグについてSOでおしゃべりを聞いています。

于 2015-04-10T18:36:10.850 に答える
25

小次郎の答えに基づいて構築:

docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '

  1. コンテナ ID を取得する
  2. 各コンテナー ID の最終実行終了コードを取得する
  3. 「0」で始まらないステータスコードのみ
  4. 0 以外のステータス コードの数を数えます
  5. 空白を取り除く

返された 0 以外の終了コードの数を返します。すべてがコード 0 で終了した場合は 0 になります。

于 2015-10-22T22:04:45.740 に答える
2

docker-railsを使用すると、メイン プロセスに返されるコンテナーのエラー コードを指定できるため、CI サーバーで結果を判断できます。docker を使用したレールの CI および開発に最適なソリューションです。

例えば

exit_code: web

コマンドの結果として、コンテナの終了コードdocker-rails.ymlが生成されます。 標準の単なるメタ ラッパーであり、異なる環境 (開発、テスト、parallel_tests) で同じ基本構成を継承/再利用する可能性を提供します。webdocker-rails ci testdocker-rails.ymldocker-compose.yml

于 2015-09-30T16:53:18.260 に答える