докер перестанет не уважать stop_grace_period

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

Изображение курсора над кнопкой IntelliJ quot;стопquot;

Подводя итог:

Ожидаемый результат: любой контейнер, запущенный с помощью 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 задает параметр API stop_timeout при создании контейнера. Вы упомянули более новую docker compose (с пробелом, docker подкомандой); пара ошибок, подобных этой, появилась в вопросах SO, и я мог бы вызвать ошибку в ядре Docker.