У меня есть файл 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.
Мои вопросы:
Когда вы используете 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 хочет иметь способ предотвратить перезапуск петли, если вы его убьете, вы действительно захотите убить его.
Я нашел следующие полезные ссылки, которые показывают одинаковое поведение в разных версиях (так что это не ошибка, а ожидаемое поведение):