У меня есть 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
и 3
docker-compose ведут себя одинаково. Моя система - Ubuntu Server 16.04 x64.
Мои вопросы:
- Почему docker-compose не перезапускает разбитый (убитый) контейнер?
- Как проверить, работает ли политика перезапуска?
docker
docker-compose
Марчин Заблоки
источник
источник
Ответы:
Когда вы используете Docker kill, это ожидаемое поведение, так как Docker не перезапускает контейнер: «Если вы останавливаете контейнер вручную, его политика перезапуска игнорируется до тех пор, пока демон Docker не перезапустится или контейнер не будет перезапущен вручную. Это еще одна попытка предотвратить цикл перезапуска " (ссылка)
Если вы используете docker stop или docker kill, вы вручную останавливаете контейнер. Вы можете выполнить несколько тестов по поводу политик перезапуска: перезапустить демон docker, перезагрузить сервер, использовать CMD внутри контейнера и запустить выход ...
Например, если я уничтожаю свой контейнер, развернутый с помощью политики перезапуска, я вижу, что он завершился с кодом 137, но он не перезапускается в соответствии с докером ps -a, он остается завершенным:
Но если я перезапущу демона ...
Контейнер, для которого была задана политика перезапуска, запускается снова, о чем говорится в документации, поэтому Docker kill - это не тот способ, которым вы должны тестировать политику перезапуска, так как предполагается, что вы намеренно остановили контейнер, а Docker хочет иметь способ предотвратить перезапуск. петли, если ты убиваешь это, ты действительно хочешь убить это.
Я нашел следующие ссылки ценными, которые показывают одинаковое поведение в разных версиях (так что это не ошибка, а ожидаемое поведение):
источник