linux - lxd - ¿Cómo determinar si un proceso se ejecuta dentro de lxc/Docker?
lxd ubuntu (11)
Compruebe todas las soluciones anteriores en Python:
import os
import subprocess
def in_container():
# type: () -> bool
""" Determines if we''re running in an lxc/docker container. """
out = subprocess.check_output(''cat /proc/1/sched'', shell=True)
out = out.decode(''utf-8'').lower()
checks = [
''docker'' in out,
''/lxc/'' in out,
out.split()[0] not in (''systemd'', ''init'',),
os.path.exists(''/.dockerenv''),
os.path.exists(''/.dockerinit''),
os.getenv(''container'', None) is not None
]
return any(checks)
¿Hay alguna forma 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?
Docker crea un archivo .dockerenv
en la raíz del árbol de directorio dentro del contenedor. Puede ejecutar este script para verificar
#!/bin/bash
if [ -f /.dockerenv ]; then
echo "I''m inside matrix ;(";
else
echo "I''m living in real world!";
fi
MÁS: Ubuntu en realidad tiene un script bash: /bin/running-in-container
y realmente puede devolver el tipo de contenedor en el que se ha invocado. Puede ser útil. No sé sobre otras distribuciones importantes sin embargo.
Docker está evolucionando día a día, por lo que no podemos decir con certeza si van a mantener .dockerenv .dockerinit
en el futuro.
En la mayoría de los sabores de Linux, init
es el primer proceso para comenzar. Pero en el caso de los contenedores esto no es cierto.
#!/bin/bash
if ps -p1|grep -q init;then
echo "non-docker"
else
echo "docker"
fi
En un nuevo sistema ubuntu 16.04, nuevo systemd & lxc 2.0
sudo grep -qa container=lxc /proc/1/environ
Este SO Q & A: "Averigüe si el sistema operativo se está ejecutando en un entorno virtual" ; aunque no es lo mismo que la pregunta del OP, de hecho responde casos comunes de encontrar en qué contenedor estás (si es que lo hace).
En particular, instale y lea el código de este script bash que parece funcionar bastante bien:
virt-what :
sudo apt install virt-what
Función Handy Python para verificar si se está ejecutando en Docker (solo linux, obvs.):
def in_docker():
""" Returns: True if running in a Docker container, else False """
with open(''/proc/1/cgroup'', ''rt'') as ifh:
return ''docker'' in ifh.read()
La forma más fácil sería verificar el entorno. Si tiene la variable container=lxc
, se encuentra dentro de un contenedor.
De lo contrario, si eres root, puedes intentar ejecutar mknod
o mount
operación, si falla, lo más probable es que estés en un contenedor con capacidades caídas.
Mi respuesta solo se aplica a los procesos de Node.js, pero puede ser relevante para algunos visitantes que tropiezan con esta pregunta y buscan una respuesta específica de Node.js.
Tuve el mismo problema y confiando en /proc/self/cgroup
. /proc/self/cgroup
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 contenedor npm te ayudará en Node.js. Actualmente no se prueba en Io.js, pero también puede funcionar allí.
Una forma concisa de comprobar si hay docker en un script bash es:
#!/bin/bash
if grep docker /proc/1/cgroup -qa; then
echo I''m running on docker.
fi
Usamos el programa sched (/ proc / $ PID / sched) para extraer el PID del proceso. El PID del proceso dentro del contenedor diferirá, entonces es PID en el host (un sistema que no es contenedor).
Por ejemplo, la salida de / proc / 1 / sched en un contenedor devolverá:
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
Mientras está en un host no contenedor:
$ cat /proc/1/sched | head -n 1
init (1, #threads: 1)
Esto ayuda a diferenciar si estás en un contenedor o no.
La forma más confiable es verificar /proc/1/cgroup
. Le indicará los grupos de control del proceso init, y cuando no se encuentre en un contenedor, eso será /
para todas las jerarquías. Cuando se encuentre dentro de un contenedor, verá el nombre del punto de anclaje; que, con contenedores LXC / Docker, será algo así como /lxc/<containerid>
o /docker/<containerid>
respectivamente.