Czy istnieje sposób, aby określić, czy proces (skrypt) działa w kontenerze LXC (środowisko wykonawcze ~ Docker)? Wiem, że niektóre programy są w stanie wykryć, czy działają w maszynie wirtualnej, czy coś podobnego jest dostępne dla lxc / docker?
172
Odpowiedzi:
Najbardziej niezawodnym sposobem jest sprawdzenie
/proc/1/cgroup
. Powie to grupy kontrola procesu init, a kiedy jesteś nie w pojemniku, który będzie/
dla wszystkich hierarchiach. Gdy jesteś w kontenerze, zobaczysz nazwę punktu zakotwiczenia. W przypadku kontenerów LXC / Docker będzie to coś podobnego/lxc/<containerid>
lub/docker/<containerid>
odpowiednio.źródło
docker
zamiastlxc
w tych ścieżkach/
wszystkich cgroup; w moim systemie Debian 9 (Systemd 232) tylko trzy z dziesięciu cgroups (3:cpuset
,4:perf_event
i7:freezer
) są u nasady; reszta jest pod/init.scope
. To powiedziawszy, myślę, że wyszukiwanie tego pliku:/docker/
jest obecnie prawdopodobnie najbardziej niezawodną heurystyką.grep 'docker\|lxc' /proc/1/cgroup
działa dla mnie na Dockerze 18.09.Docker tworzy
.dockerenv
plik w katalogu głównym drzewa katalogów wewnątrz kontenera. Możesz uruchomić ten skrypt, aby zweryfikowaćWIĘCEJ: Ubuntu faktycznie ma skrypt bash:
/bin/running-in-container
i faktycznie może zwrócić typ kontenera, w którym został wywołany. Może być pomocny. Nie wiem jednak o innych głównych dystrybucjach.źródło
.dockerinit
plik został usunięty w ostatnich wersjach Dockera , więc ta metoda nie będzie już działać. W chwili pisania tego.dockerenv
pliku plik jest nadal przechowywany, więc być może można go zamiast tego użyć./bin/running-in-container
jest dostarczane przezupstart
. Wraz z przejściem na systemd może to zniknąć. Mam nadzieję, że nie - to brzmi pożytecznie!.dockerenv
jest zalecaneW nowym systemie ubuntu 16.04, nowy systemd i lxc 2.0
źródło
Zwięzły sposób sprawdzenia, czy docker jest w skrypcie bash jest:
źródło
Poręczna funkcja Pythona do sprawdzenia, czy działa w Dockerze:
źródło
kubepods
chyba.Używamy harmonogramu proc (/ proc / $ PID / schedule), aby wyodrębnić PID procesu. PID procesu wewnątrz kontenera będzie się różnił od jego PID na hoście (system niekontenerowy).
Na przykład wynik operacji / proc / 1 / schedule w kontenerze zwróci:
Na hoście innym niż kontener:
Pomaga to w rozróżnieniu, czy jesteś w kontenerze, czy nie.
źródło
sh
i nieinit
ma, ale może to być prawie wszystko.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
Najłatwiej byłoby sprawdzić otoczenie. Jeśli masz
container=lxc
zmienną, jesteś w kontenerze.W przeciwnym razie, jeśli jesteś rootem, możesz spróbować wykonać
mknod
lub wykonaćmount
operację, jeśli to się nie powiedzie, najprawdopodobniej znajdziesz się w kontenerze z utraconymi możliwościami.źródło
/proc/1/cgroup
nie pozwala ci tego wykryć.docker run alpine env
nie daje niczego, co wygląda jak ta zmiennaMoja odpowiedź dotyczy tylko procesów Node.js, ale może być odpowiednia dla niektórych odwiedzających, którzy natkną się na to pytanie, szukając konkretnej odpowiedzi na Node.js.
Miałem ten sam problem i polegając na
/proc/self/cgroup
utworzeniu pakietu npm wyłącznie w tym celu - aby wykryć, czy proces Node.js działa w kontenerze Docker, czy nie.Kontenerowy moduł npm pomoże Ci w Node.js. Obecnie nie jest testowany w Io.js, ale równie dobrze może tam działać.
źródło
Sprawdź wszystkie powyższe rozwiązania w Pythonie:
Dowód koncepcji:
źródło
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
zgodnie z zaakceptowaną odpowiedzią tutaj stackoverflow.com/questions/20010199/…cat
! Niezły :-DDocker ewoluuje z dnia na dzień, więc nie możemy z całą pewnością stwierdzić, czy utrzymają się
.dockerenv .dockerinit
w przyszłości.W większości odmian Linuksa
init
jest to pierwszy proces do uruchomienia. Ale w przypadku kontenerów to nieprawda.źródło
init
, co nie jest prawdą w systemach opartychsystemd
lublaunchd
opartych ...init
), OpenRC, initng, runit. Zobacz tutaj . Większość nowoczesnych systemów opartych na Linuksiesystemd
używałaby, niektóre starsze, startowałyby ... Wszystkie nowoczesne systemy OS X by używałylaunchd
Pytania i odpowiedzi dotyczące SO: „Dowiedz się, czy system operacyjny działa w środowisku wirtualnym” ; choć nie jest to to samo, co pytanie OP, faktycznie odpowiada na typowe przypadki znalezienia kontenera, w którym się znajdujesz (jeśli w ogóle).
W szczególności zainstaluj i przeczytaj kod tego skryptu bash, który wydaje się działać całkiem dobrze:
virt-what :
źródło
virt-what
wersją 1.14-1 na Ubuntu 16.04. Potrzebuje poprawki.Przetłumaczyłem odpowiedź JJC na rubin
źródło
W kontenerze Dockera wpisy
/proc/self/cgroup
są montowane do cgroups na hoście.np. w pojemniku
podczas gdy to samo na hoście
Używanie czegoś w powłoce do testu niskoprofilowego
źródło
Może to załatwi sprawę:
Czy tego chcesz? Mam nadzieję, że to pomoże =)
źródło
docker
Oczywiście żaden plik binarny nie jest dostępny z wnętrza kontenera.docker
dostęp do gniazda docker hosta .