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

23

У меня есть docker compose file с 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и 3docker-compose ведут себя одинаково. Моя система - Ubuntu Server 16.04 x64.

Мои вопросы:

  1. Почему docker-compose не перезапускает разбитый (убитый) контейнер?
  2. Как проверить, работает ли политика перезапуска?
Марчин Заблоки
источник
1
Я был там много раз, но, как вы видите, документация не является надежной, и нет объяснения, как работает эта функция, поэтому я задал вопрос - я хотел бы получить ответ от кого-то с практическим опытом в этой области.
Марчин Заблоки

Ответы:

20

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

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

Например, если я уничтожаю свой контейнер, развернутый с помощью политики перезапуска, я вижу, что он завершился с кодом 137, но он не перезапускается в соответствии с докером 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 kill - это не тот способ, которым вы должны тестировать политику перезапуска, так как предполагается, что вы намеренно остановили контейнер, а Docker хочет иметь способ предотвратить перезапуск. петли, если ты убиваешь это, ты действительно хочешь убить это.

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

Мигель AC
источник