Netcat (n c / ncat) не может быть прерван в Docker - PullRequest
0 голосов
/ 24 января 2020

У меня есть служба, которая выполняет некоторые задачи, а затем открывает порт, чтобы другие службы знали, что он завершен. Я использую nc, чтобы сделать это: nc -l -k -p 1337. Я использую docker-compose для управления службами.

При закрытии служб служба, запущенная nc, всегда закрывается на несколько секунд, пока она должна быть мгновенной. Я думаю, что процесс не прерывается и docker должен убить его. Если я запускаю nc в той же службе через docker-compose run, я не могу прервать процесс с помощью Ctrl + C.

При локальном запуске nc его можно немедленно прекратить с помощью Ctrl + C.

Как создать службу, работающую nc -l -k -p 1337, которая может быть прервана?

Dockerfile

FROM ruby:2.6.3-alpine

RUN apk add --no-cache netcat-openbsd

COPY entrypoint.sh ./
RUN chmod +x entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

entrypoint.sh

#!/bin/sh

# ...

nc -l -k -p 1337

docker-compose.yml

services:
  nc:
    build:
      context: .
      dockerfile: Dockerfile

docker-compose up --build

ИЛИ:

entrypoint.sh

#!/bin/sh

# ...

exec "$@"

docker-compose.yml

services:
  nc:
    build:
      context: .
      dockerfile: Dockerfile
    command: nc -l -k -p 1337

docker-compose up --build

docker-compose run --rm nc nc -l -k -p 1337

1 Ответ

0 голосов
/ 24 января 2020

Предполагая, что nc на самом деле реагирует на сигналы в нормальных условиях, вам необходимо:

  1. Использовать exec
  2. Использовать список версий команды.

Итак, в первом случае добавьте exec к сценарию оболочки.

А во втором случае, вероятно, потребуется command: ["nc", "-l", "-k", "-p", "1337"] в файле compose.

См. https://hynek.me/articles/docker-signals/ для полного контрольного списка.

...