Есть ли способ определить, выполняется ли процесс (скрипт) внутри контейнера lxc (~ среда выполнения Docker)? Я знаю, что некоторые программы могут определить, работают ли они внутри виртуальной машины, доступно ли что-то подобное для lxc / docker?
172
Ответы:
Самый надежный способ - это проверить
/proc/1/cgroup
. Он скажет вам контрольные группы процесса инициализации, и когда вы не в контейнере, это будет/
для всех иерархий. Когда вы находитесь внутри контейнера, вы увидите название точки привязки. С контейнерами LXC / Docker это будет что-то вроде/lxc/<containerid>
или/docker/<containerid>
соответственно.источник
docker
вместоlxc
этих путей/
для всех cgroups; в моей системе Debian 9 (systemd 232) только три из десяти cgroups (3:cpuset
,4:perf_event
и7:freezer
) находятся в корне; остальные находятся под/init.scope
. Тем не менее, я думаю, что поиск этого файла,:/docker/
возможно, является наиболее надежной эвристикой на данный момент.grep 'docker\|lxc' /proc/1/cgroup
у меня работает на Docker 18.09.Docker создает
.dockerenv
файл в корне дерева каталогов внутри контейнера. Вы можете запустить этот скрипт для проверкиЕще: Ubuntu на самом деле имеет скрипт bash:
/bin/running-in-container
и он может возвращать тип контейнера, в котором он был вызван. Может быть полезным. Не знаю о других крупных дистрибутивах.источник
.dockerinit
файл был удален в последних версиях Docker , поэтому этот метод больше не будет работать. На момент написания,.dockerenv
файл все еще хранится, так что, возможно, его можно будет использовать вместо этого./bin/running-in-container
предоставляетсяupstart
. С переходом на systemd это может уйти. Я надеюсь, что нет - это звучит полезно!.dockerenv
является не рекомендуетсяВ новой системе Ubuntu 16.04, новом systemd & lxc 2.0
источник
Краткий способ проверить наличие докера в скрипте bash:
источник
Удобная функция Python для проверки работы в Docker:
источник
kubepods
я думаю.Мы используем схему процесса (/ proc / $ PID / sched) для извлечения PID процесса. PID процесса внутри контейнера будет отличаться от PID на хосте (неконтейнерная система).
Например, вывод / proc / 1 / sched для контейнера вернет:
В то время как на неконтейнерном хосте:
Это помогает отличить, если вы находитесь в контейнере или нет.
источник
sh
и неinit
там, но это может быть почти что-либо в любом.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
Самый простой способ - проверить окружающую среду. Если у вас есть
container=lxc
переменная, вы находитесь в контейнере.В противном случае, если вы являетесь пользователем root, вы можете попытаться выполнить
mknod
или выполнитьmount
операцию, если она не удастся, вы, скорее всего, окажетесь в контейнере с удаленными возможностями.источник
/proc/1/cgroup
вы не можете это обнаружить.docker run alpine env
не дает ничего похожего на эту переменнуюМой ответ применим только к процессам Node.js, но может быть актуален для некоторых посетителей, которые сталкиваются с этим вопросом и ищут конкретный ответ Node.js.
У меня была та же проблема, и я полагался на то,
/proc/self/cgroup
что создал пакет npm исключительно для этой цели - чтобы определить, выполняется ли процесс Node.js внутри контейнера Docker или нет.Контейнерный модуль НПМ поможет вам в Node.js. В настоящее время он не тестируется в Io.js, но может также работать и там.
источник
Проверьте все решения выше в Python:
Подтверждение концепции:
источник
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
согласно принятому ответу здесь stackoverflow.com/questions/20010199/…cat
! Хороший :-DДокер развивается день ото дня, поэтому мы не можем точно сказать, собираются ли они остаться
.dockerenv .dockerinit
в будущем.В большинстве версий Linux
init
это первый процесс для запуска. Но в случае контейнеров это не так.источник
init
, который не соответствует действительностиsystemd
илиlaunchd
систем на основе ...init
хотя эти два и некоторые другие могут называть их PID 1 ), OpenRC, initng, runit. Смотрите здесь . Большинство современных систем на основе Linux будет использоватьsystemd
, некоторые старые, выскочки .... Все современные системы OS X будут использоватьlaunchd
Это SO Q & A: «Узнайте, работает ли ОС в виртуальной среде» ; хотя это не то же самое, что вопрос ОП, он действительно отвечает на распространенные случаи определения того, в каком контейнере вы находитесь (если вообще).
В частности, установите и прочитайте код этого bash-скрипта, который, кажется, работает довольно хорошо:
вирт-что :
источник
virt-what
версией 1.14-1 в Ubuntu 16.04. Нужен патч.Я перевел ответ JJC на рубин
источник
В Docker-контейнере записи
/proc/self/cgroup
монтируются в cgroups на хосте.например, в контейнере
тогда как на хосте тоже самое
Использование чего-то в оболочке для низкопрофильного теста
источник
Может быть, это сделать трюк:
Это то, что вы хотите? Надеюсь, это поможет =)
источник
docker
двоичная доступен с внутренней стороны контейнера, очевидно.docker
доступ к сокету docker хоста.