Назад | Перейти на главную страницу

Как работает политика «перезапуск: всегда» в 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, вы вручную останавливаете контейнер. Вы можете провести несколько тестов политик перезапуска: перезапустить демон докеров, перезагрузить сервер, использовать CMD внутри контейнера и запустить выход ...

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

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