¿Hay alguna manera de determinar si un proceso (script) se ejecuta dentro de un contenedor lxc (~ Docker runtime)? Sé que algunos programas pueden detectar si se ejecutan dentro de una máquina virtual, ¿hay algo similar disponible para lxc / docker?
172

Respuestas:
La forma más confiable es verificar
/proc/1/cgroup. Se le dirá que los grupos de control del proceso init, y cuando estás no en un contenedor, que será/para todas las jerarquías. Cuando esté dentro de un contenedor, verá el nombre del punto de anclaje. Con los contenedores LXC / Docker, será algo así/lxc/<containerid>o/docker/<containerid>respectivamente.fuente
dockerlugar delxcen esos caminos/para todos los cgroups; en mi sistema Debian 9 (systemd 232) solo tres de los diez grupos c (3:cpuset,4:perf_eventy7:freezer) están en la raíz; El resto está debajo/init.scope. Dicho esto, creo que buscar ese archivo:/docker/es probablemente la heurística más confiable en este momento.grep 'docker\|lxc' /proc/1/cgroupfunciona para mí en Docker 18.09.Docker crea un
.dockerenvarchivo en la raíz del árbol de directorios dentro del contenedor. Puede ejecutar este script para verificarMÁS: Ubuntu en realidad tiene un script bash:
/bin/running-in-containery en realidad puede devolver el tipo de contenedor en el que se ha invocado. Podría ser útil. Sin embargo, no sé sobre otras distribuciones importantes.fuente
.dockerinitarchivo se ha eliminado en versiones recientes de Docker , por lo que este método ya no funcionará. Al momento de escribir esto, el.dockerenvarchivo todavía se mantiene, por lo que quizás podría usarse en su lugar./bin/running-in-containeres proporcionado porupstart. Con la transición a systemd, podría desaparecer. Espero que no, ¡suena útil!.dockerenvse no se recomiendaEn un nuevo sistema ubuntu 16.04, nuevo systemd y lxc 2.0
fuente
Una forma concisa de verificar el acoplador en un script bash es:
fuente
Práctica función de Python para verificar si se ejecuta en Docker:
fuente
kubepodssupongo.Usamos el programado del proceso (/ proc / $ PID / sched) para extraer el PID del proceso. El PID del proceso dentro del contenedor será diferente, entonces es PID en el host (un sistema sin contenedor).
Por ejemplo, la salida de / proc / 1 / sched en un contenedor devolverá:
Mientras esté en un host que no sea contenedor:
Esto ayuda a diferenciar si estás en un contenedor o no.
fuente
shy no estáinitallí, pero puede ser casi cualquier cosa.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)La forma más fácil sería verificar el entorno. Si tiene la
container=lxcvariable, está dentro de un contenedor.De lo contrario, si es root, puede intentar realizar
mknodumountoperar, si falla, lo más probable es que se encuentre en un contenedor con capacidades caídas.fuente
/proc/1/cgroupno le permite detectar eso.docker run alpine envno da nada que se parezca a esa variableMi respuesta solo se aplica a los procesos Node.js pero puede ser relevante para algunos visitantes que tropiezan con esta pregunta en busca de una respuesta específica de Node.js.
Tuve el mismo problema y confiando en
/proc/self/cgroupque creé un paquete npm solo para este propósito: detectar si un proceso Node.js se ejecuta dentro de un contenedor Docker o no.El módulo npm contenedorizado lo ayudará en Node.js. Actualmente no está probado en Io.js, pero también podría funcionar allí.
fuente
Verifique todas las soluciones anteriores en Python:
Prueba de concepto:
fuente
def is_non_docker(): return os.path.exists('/proc/1/cgroup')según la respuesta aceptada aquí stackoverflow.com/questions/20010199/…cat! Nice one :-DDocker está evolucionando día a día, por lo que no podemos decir con certeza si se mantendrán
.dockerenv .dockeriniten el futuro.En la mayoría de los sabores de Linux
inites el primer proceso en comenzar. Pero en el caso de los contenedores esto no es cierto.fuente
init, que no es cierto ensystemdolaunchdsistemas basados ...init), OpenRC, initng, runit. Vea aquí . La mayoría de los sistemas modernos basados en Linux usaríansystemd, algunos más antiguos, nuevos ... Todos los sistemas OS X modernos usaríanlaunchdEstas preguntas y respuestas sobre SO: "Averigüe si el sistema operativo se ejecuta en un entorno virtual" ; aunque no es lo mismo que la pregunta del OP, de hecho responde a casos comunes de encontrar en qué contenedor se encuentra (si es que lo hace).
En particular, instale y lea el código de este script bash que parece funcionar bastante bien:
virt-what :
fuente
virt-whatversión 1.14-1 en Ubuntu 16.04. Necesita parche.He traducido la respuesta de JJC al rubí
fuente
En un contenedor acoplable, las entradas
/proc/self/cgroupse montan en cgroups en el host.por ejemplo, en un contenedor
mientras que, lo mismo en el host
Usar algo en el shell para una prueba de bajo perfil
fuente
Tal vez esto haga el truco:
¿Es eso lo que quieres? Espero que ayude =)
fuente
dockerbinarios disponibles desde el interior del contenedor, obviamente.dockeracceso al zócalo docker de los hosts.