Невозможно остановить мой Docker контейнер с помощью Ctrl- C - PullRequest
2 голосов
/ 18 марта 2020

Я использую WSL2 на Windows 10 с использованием образа Ubuntu и Docker для рабочего стола Windows (2.2.2.0) с интеграцией WSL.

У меня есть сервер Rust TCP. Когда я запускаю его с cargo run (или двоичным файлом после cargo install), он делает все правильно, и я могу отправить Ctrl - C на него для завершения. Я не делаю никакой явной обработки сигнала в коде.

Я превратил его в Docker изображение. Вот Dockerfile.

FROM rust:1.40 as builder
COPY . .
RUN cargo install --path . --root .

FROM debian:buster-slim
COPY --from=builder ./bin/myserver ./myserver
EXPOSE 8080
ENTRYPOINT ["./myserver"]

Я тогда делаю:

docker build -t myserver .
docker run -it --rm -p 8080:8080 myserver

Попытка Ctrl - C, процесс показывает ^C символ в терминале, но сигнал, кажется, не достигает процесса. У меня есть для использования docker kill. Я читал другие сообщения, такие как это и это . Предполагается, что комбинация -it и использование версии параметра массива ENTRYPOINT или CMD должны позволить сигналу достичь его, однако, похоже, это не помогает мне.

Видеть если это было связано с моей настройкой (Docker для Desktop, WSL и т. д. c.) или моим Dockerfile, я следовал README для docker -http-https-echo и Я могу Ctrl - C процесс. Проверка Dockerfile не показывает, что он делает что-то отличное от меня, но я явно что-то упускаю.

1 Ответ

1 голос
/ 23 марта 2020

Причина вашей проблемы в том, что ядро ​​обрабатывает процесс с PID 1 специально и по умолчанию не прерывает процесс при получении сигналов SIGTERM или SIGINT.

У вас есть две опции:

  1. Добавить --init флаг к команде docker run. Таким образом, будет создан специальный процесс с PID 1, который будет родительским для вашего процесса и будет проксировать все сигналы и должным образом пожинать ваши процессы.
  2. Добавьте явную обработку сигналов в ваше приложение, что хорошо, если вы хочу сделать постепенное отключение.

Хорошей практикой является объединение обоих методов.

...