Процесс запуска Docker заключается в том, что Docker устанавливает некоторые переменные среды (из параметров Dockerfile и docker run -e
), а затем запускает точку входа контейнера.Все, что происходит в точке входа, не входит в компетенцию Докера.В частности, отладочная оболочка, которая запускается через docker exec
, не является дочерней по отношению к точке входа и не будет наследовать переменные среды, которые там установлены.(NB: я нигде не могу найти это явно в документации Docker.)
Один хороший эксперимент, который стоит попробовать - это запустить:
% docker run -d --name test busybox sh -c 'sleep 60; sleep 60'
6c6aada7e5299e816e9d12dfab9845cc396485a46d909255375128b87ee5eedf
% docker exec test ps -o pid,ppid,comm
PID PPID COMMAND
1 0 sh
6 1 sleep
7 0 ps
Корневой процесс контейнера - это оболочка, которая получаетидентификатор процесса 1, и он запускает подпроцесс sleep
с идентификатором процесса 6 и идентификатором родительского процесса 1. Команда docker exec
ps
получает новый идентификатор процесса, но имеет искусственный идентификатор родительского процесса, равный 0 - это непотомок корневого процесса контейнера.
Если вы хотите отладить среду запуска вашего образа, с типичным сценарием точки входа, таким как
#!/bin/sh
. /env.sh
exec "$@"
, вы можете docker run --rm -it myimage sh
, и полученная оболочка получитзапускается через скрипт входа.Но, как вы заметили, попытка отладки через docker exec
не проходит ни через одну часть последовательности точек входа.