docker-composeで「restart:always」ポリシーはどのように機能しますか?


23

次のように、PostgreSQLとアプリケーションを使用してdocker composeファイルを作成します。

version: '3'

services:
  postgresql:
    image: postgres:9.6.6
    ports:
      - 9932:5432
    expose:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=pass
    restart: always
    volumes:
      - /data:/var/lib/postgresql/data

  myapp:
    image: myapp
    links:
      - postgresql
    depends_on:
      - "postgresql"
    restart: always
    ports:
      - "5000:5000"

問題は、終了コードが137であっても、コンテナrestart: alwaysを殺すと(アプリのクラッシュをシミュレートするdocker kill)ポリシーが機能しないように見え、docker-composeがコンテナを再起動しないことです。ポリシーを使用すると、同じ動作を観察します。バージョンとdocker-composeの動作は同じです。私のシステムはUbuntu Server 16.04 x64です。restart: on-failure23

私の質問は:

  1. docker-composeがクラッシュした(殺された)コンテナを再起動しないのはなぜですか?
  2. 再起動ポリシーが機能するかどうかを確認する方法は?


1
私は何度もそこにいましたが、ご覧のとおり、ドキュメントは堅牢ではなく、この機能がどのように機能するかについての説明はありません。だから私は質問をしました。
マーチンザブロッキ

回答:


20

Docker killを使用する場合、これはDockerがコンテナを再起動しないため、予期される動作です。「コンテナを手動で停止すると、Dockerデーモンが再起動するか、コンテナが手動で再起動されるまで、再起動ポリシーは無視されます。再起動ループ」(参照)

docker stopまたはdocker killを使用する場合、手動でコンテナーを停止しています。再起動ポリシーに関するいくつかのテストを実行できます。dockerデーモンの再起動、サーバーの再起動、コンテナ内でのCMDの使用、exitの実行...

たとえば、再起動ポリシーでデプロイされたコンテナを強制終了すると、コード137で終了したことがわかりますが、docker ps -aに従って再起動されず、終了したままになります。

[root@andromeda ~]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   3 minutes ago       Exited (137) 34 seconds ago                       keepalive_redis_1

しかし、デーモンを再起動すると...

[root@andromeda ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   30 minutes ago      Up 2 seconds        6379/tcp            keepalive_redis_1

再起動ポリシーで設定されたコンテナは、ドキュメントに記載されているとおりに再起動するため、意図的にコンテナを停止し、Dockerが再起動を防止する方法を望んでいるため、docker killは再起動ポリシーをテストする方法ではありませんループ、それを殺すなら、本当にそれを殺したい。

異なるバージョンで同じ動作を示す以下のリンクが貴重であることがわかりました(したがって、これはバグではなく、予想される動作です)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.