Как работает политика "перезапуск: всегда" в docker-compose?

У меня есть файл docker compose с PostgreSQL и моим приложением, например:

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"

Проблема в том, что restart: always политика, похоже, не работает, когда я убиваю контейнер (имитируя сбой приложения с помощью docker kill) и docker-compose не перезапускает мой контейнер, даже несмотря на то, что Код выхода - 137. Я наблюдаю такое же поведение, когда использую restart: on-failure политика. Варианты исполнения 2 и 3 из docker-compose ведут себя так же. Моя система - Ubuntu Server 16.04 x64.

Мои вопросы таковы:

  1. Почему docker-compose не перезапускает разбитый (убитый) контейнер?
  2. Как проверить, работает ли политика перезапуска?

Когда вы используете docker kill, это ожидаемое поведение, поскольку Docker не перезапускает контейнер: "Если вы вручную останавливаете контейнер, его политика перезапуска игнорируется до перезапуска демона Docker или перезапуска контейнера вручную. Это еще одна попытка предотвратить цикл перезапуска" (ссылка)

Если вы используете docker stop или docker kill, вы вручную останавливаете контейнер. Вы можете выполнить некоторые тесты политик перезапуска: перезапустить демон docker, перезагрузить сервер, использовать CMD внутри контейнера и выполнить выход...

Например, если я уничтожу свой контейнер, развернутый с помощью политики перезапуска, я увижу, что он вышел с кодом 137, но он не перезапускается в соответствии с docker ps -a, он остается завершенным:

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

Но если я перезапущу демона...

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

Контейнер, который был установлен с помощью политики перезапуска, запускается снова, как указано в документации, поэтому docker kill - это не тот способ, которым вы должны тестировать политику перезапуска, поскольку предполагается, что вы намеренно остановили контейнер, а Docker хочет иметь способ предотвратить циклы перезапуска, если вы его убьете, вы действительно хочу убить его.

Я нашел следующие ценные ссылки, которые показывают одинаковое поведение в разных версиях (так что это не ошибка, а ожидаемое поведение):

Я был там много раз, но, как вы можете видеть, документация не является надежной, и нет никакого объяснения, как работает эта функция, поэтому я задал вопрос - я хотел бы увидеть ответ от кого-то с практическим опытом в этой области.

Compose specification | Docker Documentation & Compose specification | Docker Documentation