#docker #docker-compose
Вопрос:
У меня есть контейнер Docker под управлением Adobe Experience Manager. Это Java-приложение, для выключения которого требуется некоторое время. Раннее завершение работы приводит к повреждению репозитория, что приводит к неудачным последующим запускам, и часто требует, чтобы я удалил все и начал с нуля.
Мой док-файл просто запускается:
CMD exec java
-Xms256m
-Xmx$INSTANCE_MAX_MEMORY
-Djava.awt.headless=true
-Xdebug
-Xnoagent
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:$DEBUG_PORT
-jar /opt/aem/cq-quickstart.jar -p 4502 -r author
-v -nofork
И это порождает процесс Java как PID 1, что означает, что это процесс, получающий SIGTERM при вызове docker stop
.
Мой файл docker-compose stop_grace_period
определился как довольно большой промежуток времени.
version: '3'
services:
aem:
stop_grace_period: 120s
build:
context: .
ports:
- "4502:4502"
Если я запущу docker compose up -d
, служба запустится правильно.
Когда я заканчиваю, вот где у меня возникают проблемы. В зависимости от того, как я его убью, иногда он не будет ждать 120 секунд (и вместо этого будет ждать максимум 10 секунд, прежде чем отправить SIGKILL).
$ docker compose stop aem
ждет достаточно долго. Он даже подсчитывает время в выводе команды, и оно часто превышает 10 секунд.
$ docker stop aem
не ждет. Я знаю, пройду ли я
$ docker stop aem --time 120 aem
Что это подождет, но так легко забыть сделать это и разрушить ваш экземпляр сервера.
Я также использую IntelliJ, и нажатие этой кнопки также не ждет достаточно долго, хотя я не уверен, что она вызывает под капотом, и я не уверен, как это определить.
Подводя итог:
Ожидаемый результат: любой контейнер, запущенный с помощью docker-compose и имеющий stop_grace_period
набор, будет выполнять это stop_grace_period
даже при вызове docker stop [container-name]
без --time
него .
Фактический результат: контейнеры, запущенные из docker-compose, работают только stop_grace_period
при остановке использования docker-compose.
Итак, мне интересно следующее: когда контейнер запускается из docker-compose, stop_grace_period
не сохраняется ли он как какое-то свойство метаданных для этого контейнера? Похоже, что, если docker-compose не находится в контексте при вызове stop, это stop_grace_period
не выполняется.
Комментарии:
1. Стандартный
docker-compose
инструмент Python задает параметр APIstop_timeout
при создании контейнера. Вы упомянули более новуюdocker compose
(с пробелом,docker
подкомандой); пара ошибок, подобных этой, появилась в вопросах SO, и я мог бы вызвать ошибку в ядре Docker.