Intereting Posts
docker-machine: нет маршрута для размещения доклер-машины по умолчанию (с использованием сети только для хоста) в некоторых сетях Wi-Fi Docker DIND не может получить доступ к частному реестру Не удается получить postgresql-9.3-postgis-2.1 на Ubuntu 14.04.1 Докер-контейнер `docker pull` возвращает` denied: access forbidden` из частного реестра gitlab API докеров: cpu_stats vs percpu_stats Докерный порт недоступен в браузере, хотя бывший запуск работает отправка электронной почты на smtp-сервер в докере Как получить идентификатор контейнера в запущенном контейнере с помощью docker-java? Передача опций «Docker Run» в Mesos / Marathon / Chronos docker-machine – sudo systemctl -f start docker err: выход из состояния 255 выход Как установить пакет python со всеми зависимостями в образ Docker? Папка для хранения контейнеров для докеров Конфигурация ipv6 контейнера докера не работает Используя Docker, как вы выполняете команды PHP-компилятора? Докер. Данный файл или каталог отсутствует

Почему попытка убить процесс в контейнере Docker вывела меня из этого?

У меня есть сервер узла v6.10.0 на моем macOS, который автоматически запускается из CMD в Dockerfile . Обычно в моей локальной неконкурированной среде разработки я использую CTRL + C, чтобы убить сервер. Не имея возможности (или не зная, как это сделать) в контейнере, я прибегаю к ps aux | grep node ps aux | grep node чтобы попытаться вручную убить процессы. Итак, я получаю что-то вроде этого:

 myapp [master] :> kubectl exec -it web-3127363242-xb50k bash root@web-3127363242-xb50k:/usr/src/app# ps aux | grep node root 15 0.4 0.9 883000 35804 ? Sl 05:49 0:00 node /usr/src/app/node_modules/.bin/concurrent --kill-others npm run start-prod npm run start-prod-api root 43 0.1 0.6 743636 25240 ? Sl 05:49 0:00 node /usr/src/app/node_modules/.bin/better-npm-run start-prod root 44 0.1 0.6 743636 25140 ? Sl 05:49 0:00 node /usr/src/app/node_modules/.bin/better-npm-run start-prod-api root 55 0.0 0.0 4356 740 ? S 05:49 0:00 sh -c node ./bin/server.js root 56 0.0 0.0 4356 820 ? S 05:49 0:00 sh -c node ./bin/api.js root 57 18.6 4.9 1018088 189416 ? Sl 05:49 0:08 node ./bin/server.js root 58 13.9 5.2 1343296 197576 ? Sl 05:49 0:06 node ./bin/api.js root 77 0.0 0.0 11128 1024 ? S+ 05:50 0:00 grep node 

Когда я пытаюсь убить одного из них

 kill -9 15 

Меня вытаскивают из оболочки моего контейнера и обратно в оболочку моего компьютера. Когда я снова вхожу в контейнер, я вижу, что процесс все еще существует с тем же идентификатором процесса. В этом примере используется модуль Kubernetes, но я считаю, что у меня есть тот же результат с входом в контейнер Docker с помощью команды docker exec .

Каждый контейнер-докер имеет ENTRYPOINT , который либо будет установлен в файле докеров , либо с помощью объявлений ENTRYPOINT или CMD , либо указан в командной docker run myimage:tag "entrypoint_command" . Когда процесс ENTRYPOINT убит, я думаю, что контейнер также будет убит. docker exec , как я понимаю, похоже на команду «прикрепления» к контейнеру. Но если ENTRYPOINT не работает, контейнер не подключается.

Насколько я понимаю, Кубернетес будет перезагружать контейнер после сбоя. Какая может быть причина, по которой вы видите, что процесс подкрепляется. Я действительно не работал с Kubernetes, но я бы попытался поиграть с тем, как репликация масштабируется для завершения вашего процесса.

Контейнеры изолируют ваше нужное приложение как pid 1 внутри пространства имен. Желаемое приложение является вашей точкой входа или cmd, если у вас нет определенной точки входа. Если уничтожение процесса приводит к выходу pid 1, контейнер немедленно остановится (подобно убийству pid 1 на хосте linux), а также убивает все остальные pids. Если в этом контейнере есть политика перезагрузки, он будет перезапущен, и процессы будут получать те же самые значения, что и в прошлый раз (при прочих равных условиях, которые он часто находится внутри контейнера).

Чтобы контейнер не останавливался, вам нужно настроить свою точку входа, чтобы она оставалась даже при уничтожении дочернего процесса. Эта сторона, имеющая выход контейнера, обычно является предпочтительным поведением для обработки неожиданных ошибок, возвращаясь в чистое состояние.