tutorial lxd español empezando con linux bash docker

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



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.