Existe alguma maneira de determinar se um processo (script) é executado dentro de um contêiner lxc (~ Docker runtime)? Eu sei que alguns programas são capazes de detectar se são executados dentro de uma máquina virtual. Existe algo semelhante disponível para o lxc / docker?
172
Respostas:
A maneira mais confiável é verificar
/proc/1/cgroup
. Ele informará os grupos de controle do processo init e, quando você não estiver em um contêiner, será/
para todas as hierarquias. Quando você estiver dentro de um contêiner, verá o nome do ponto de ancoragem. Com os contêineres LXC / Docker, será algo parecido/lxc/<containerid>
ou/docker/<containerid>
respectivamente.fonte
docker
vez delxc
nesses caminhos/
para todos os cgroups; no meu sistema Debian 9 (systemd 232), apenas três dos dez cgroups (3:cpuset
,4:perf_event
e7:freezer
) estão na raiz; o resto está abaixo/init.scope
. Dito isso, acho que pesquisar nesse arquivo:/docker/
é provavelmente a heurística mais confiável no momento.grep 'docker\|lxc' /proc/1/cgroup
funciona para mim no Docker 18.09.O Docker cria um
.dockerenv
arquivo na raiz da árvore de diretórios dentro do contêiner. Você pode executar este script para verificarMAIS: O Ubuntu realmente possui um script bash:
/bin/running-in-container
e na verdade pode retornar o tipo de contêiner em que foi chamado. Pode ser útil. Porém, não conheço outras distros importantes.fonte
.dockerinit
arquivo foi removido nas versões recentes do Docker , portanto, esse método não funcionará mais. Até o momento em que este artigo foi escrito, o.dockerenv
arquivo ainda é mantido, então talvez isso possa ser usado./bin/running-in-container
é fornecido porupstart
. Com a transição para o systemd, isso pode desaparecer. Espero que não - parece útil!.dockerenv
é não recomendadoEm um novo sistema ubuntu 16.04, o novo systemd & lxc 2.0
fonte
Uma maneira concisa de verificar a janela de encaixe em um script bash é:
fonte
Função útil do Python para verificar se está sendo executado no Docker:
fonte
kubepods
, eu acho.Usamos a programação do proc (/ proc / $ PID / sched) para extrair o PID do processo. O PID do processo dentro do contêiner será diferente do PID no host (um sistema sem contêiner).
Por exemplo, a saída de / proc / 1 / sched em um contêiner retornará:
Enquanto estiver em um host sem contêiner:
Isso ajuda a diferenciar se você está em um contêiner ou não.
fonte
sh
e nãoinit
existe, mas pode ser quase tudo em qualquer um.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
A maneira mais fácil seria verificar o ambiente. Se você tiver a
container=lxc
variável, você está dentro de um contêiner.Caso contrário, se você for root, poderá tentar executar
mknod
oumount
operar, se falhar, provavelmente estará em um contêiner com recursos descartados.fonte
/proc/1/cgroup
não permite detectar isso.docker run alpine env
não dá qualquer coisa que se parece com essa variávelMinha resposta se aplica apenas aos processos do Node.js., mas pode ser relevante para alguns visitantes que se deparam com essa pergunta à procura de uma resposta específica ao Node.js.
Eu tive o mesmo problema e, contando com a
/proc/self/cgroup
criação, criei um pacote npm apenas para esse fim - para detectar se um processo Node.js é executado dentro de um contêiner do Docker ou não.o módulo npm em contêiner ajudará você no Node.js. No momento, ele não está testado no Io.js, mas também pode funcionar lá.
fonte
Verifique todas as soluções acima em Python:
Prova de conceito:
fonte
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
acordo com a resposta aceita aqui stackoverflow.com/questions/20010199/…cat
! Nice one :-DO Docker está evoluindo dia a dia, então não podemos dizer com certeza se eles continuarão
.dockerenv .dockerinit
no futuro.Na maioria dos sabores do Linux,
init
é o primeiro processo a ser iniciado. Mas no caso de contêineres isso não é verdade.fonte
init
, o que não é verdade emsystemd
oulaunchd
sistemas baseados ...init
), OpenRC, initng, runit. Veja aqui . A maioria dos sistemas baseados em Linux modernas usariasystemd
, alguns mais, arrivista .... Todos os modernos sistemas OS X mais velhos usarialaunchd
Este SO Q&A: "Descubra se o sistema operacional está sendo executado em um ambiente virtual" ; embora não seja o mesmo que a pergunta do OP, ele realmente responde a casos comuns de encontrar em qual container você está (se é que está).
Em particular, instale e leia o código desse script bash, que parece funcionar muito bem:
virt-what :
fonte
virt-what
versão 1.14-1 no Ubuntu 16.04. Precisa de correção.Traduzi a resposta de JJC para ruby
fonte
Em um contêiner de janela de encaixe, as entradas
/proc/self/cgroup
são montadas em cgroups no host.por exemplo, em um recipiente
enquanto o mesmo no host
Usando algo no shell para um teste de baixo perfil
fonte
Talvez isso faça o truque:
É isso que você quer? Espero que ajude =)
fonte
docker
binário está disponível dentro do contêiner, obviamente.docker
e acesso ao soquete do docker dos hosts.