Як працює політика "перезапуск: завжди" в docker-compose?


23

У мене є докер-композиційний файл із 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докер-композиції поводяться однаково. Моя система - Ubuntu Server 16.04 x64.

Мої запитання:

  1. Чому docker-compose не перезапускає збій (вбитий) контейнер?
  2. Як перевірити, чи працює політика перезапуску?


1
Я був там багато разів, але, як бачите, документація не є надійною, і немає пояснень, як ця функція працює, тому я задав питання - я хотів би побачити відповідь у когось із практичним досвідом у цій галузі.
Марцін Заблоцький

Відповіді:


20

Якщо ви використовуєте 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

Контейнер, який було встановлено за допомогою політики перезавантаження, запускається заново, що говорить документація, тому вбивство докера - це не те, як слід перевірити політику перезавантаження, оскільки передбачається, що ви навмисно зупинили контейнер, і Докер хоче створити спосіб запобігти перезавантаженню. петлі, якщо ти вбиваєш його, ти дуже хочеш його вбити.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.