Apakah ada cara untuk menentukan apakah suatu proses (skrip) berjalan di dalam wadah lxc (~ Docker runtime)? Saya tahu bahwa beberapa program dapat mendeteksi apakah mereka berjalan di dalam mesin virtual, apakah tersedia sesuatu yang serupa untuk lxc / docker?
172
Jawaban:
Cara yang paling dapat diandalkan adalah memeriksa
/proc/1/cgroup
. Ini akan memberi tahu Anda kelompok kontrol dari proses init, dan ketika Anda tidak berada dalam sebuah wadah, itu akan berlaku/
untuk semua hierarki. Ketika Anda berada di dalam wadah, Anda akan melihat nama titik jangkar. Dengan wadah LXC / Docker, itu akan menjadi sesuatu seperti/lxc/<containerid>
atau/docker/<containerid>
masing - masing.sumber
docker
bukannyalxc
di jalur itu/
untuk semua cgroups; pada sistem 9 Debian saya (systemd 232) hanya tiga dari sepuluh kelompok (3:cpuset
,4:perf_event
dan7:freezer
) yang di root; sisanya ada di bawah/init.scope
. Yang mengatakan, saya pikir mencari file:/docker/
itu mungkin adalah heuristik yang paling dapat diandalkan saat ini.grep 'docker\|lxc' /proc/1/cgroup
bekerja untuk saya di Docker 18.09.Docker membuat
.dockerenv
file di akar pohon direktori di dalam wadah. Anda dapat menjalankan skrip ini untuk memverifikasiLEBIH BANYAK: Ubuntu sebenarnya memiliki skrip bash:
/bin/running-in-container
dan itu benar-benar dapat mengembalikan jenis wadah yang telah dipanggil. Mungkin bermanfaat. Tidak tahu tentang distro besar lainnya.sumber
.dockerinit
file telah dihapus di versi terbaru Docker , jadi metode ini tidak akan berfungsi lagi. Sampai tulisan ini dibuat,.dockerenv
file tersebut masih disimpan, jadi mungkin itu bisa digunakan sebagai gantinya./bin/running-in-container
disediakan olehupstart
. Dengan transisi ke systemd mungkin hilang. Saya harap tidak - kedengarannya bermanfaat!.dockerenv
adalah tidak dianjurkanPada sistem ubuntu 16.04 baru, systemd baru & lxc 2.0
sumber
Cara ringkas untuk memeriksa buruh pelabuhan dalam skrip bash adalah:
sumber
Fungsi Python yang berguna untuk memeriksa apakah berjalan di Docker:
sumber
kubepods
saya kira.Kami menggunakan sch's proc (/ proc / $ PID / sched) untuk mengekstraksi PID dari proses tersebut. PID proses di dalam wadah akan berbeda dengan PID di host (sistem non-wadah).
Misalnya, output dari / proc / 1 / sched pada suatu wadah akan kembali:
Saat berada di host non-kontainer:
Ini membantu membedakan apakah Anda berada dalam wadah atau tidak.
sumber
sh
dan tidakinit
ada di sana, tetapi mungkin hampir apa saja di keduanya.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
Cara termudah adalah dengan memeriksa lingkungan. Jika Anda memiliki
container=lxc
variabel, Anda berada di dalam sebuah wadah.Kalau tidak, jika Anda root, Anda dapat mencoba melakukan
mknod
ataumount
operasi, jika gagal, Anda kemungkinan besar berada dalam sebuah wadah dengan kemampuan yang menurun.sumber
/proc/1/cgroup
tidak memungkinkan Anda mendeteksi itu.docker run alpine env
tidak memberikan apa pun yang tampak seperti variabel ituJawaban saya hanya berlaku untuk proses Node.js tetapi mungkin relevan bagi beberapa pengunjung yang tersandung ke pertanyaan ini mencari jawaban spesifik Node.js.
Saya memiliki masalah yang sama dan mengandalkan
/proc/self/cgroup
saya membuat paket npm hanya untuk tujuan ini - untuk mendeteksi apakah proses Node.js berjalan di dalam wadah Docker atau tidak.The Modul NPM kemas akan membantu Anda dalam Node.js. Saat ini tidak diuji di Io.js tetapi mungkin juga berfungsi di sana.
sumber
Periksa semua solusi di atas dalam Python:
Bukti dari konsep:
sumber
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
sesuai dengan jawaban yang diterima di sini stackoverflow.com/questions/20010199/…cat
! Nice one :-DDocker berkembang dari hari ke hari, jadi kami tidak bisa mengatakan dengan pasti apakah mereka akan tetap
.dockerenv .dockerinit
di masa depan.Di sebagian besar rasa Linux
init
adalah proses pertama untuk memulai. Tetapi dalam kasus kontainer ini tidak benar.sumber
init
, yang tidak benar pada sistemsystemd
ataulaunchd
berbasis ...init
), OpenRC, initng, runit. Lihat di sini . Sebagian besar sistem berbasis Linux modern akan menggunakansystemd
, beberapa yang lebih tua, pemula .... Semua sistem OS X modern akan menggunakanlaunchd
T&J SO ini: "Cari tahu apakah OS berjalan di lingkungan virtual" ; meskipun tidak sama dengan pertanyaan OP, itu memang menjawab kasus umum menemukan wadah tempat Anda berada (jika sama sekali).
Khususnya, instal dan baca kode skrip bash ini yang sepertinya berfungsi cukup baik:
kebajikan-apa :
sumber
virt-what
versi 1.14-1 di Ubuntu 16.04. Butuh tambalan.Saya telah menerjemahkan jawaban JJC ke dalam ruby
sumber
Dalam wadah buruh pelabuhan, entri
/proc/self/cgroup
dipasang ke grup di host.misalnya dalam sebuah wadah
padahal, sama pada host
Menggunakan sesuatu di shell untuk tes profil rendah
sumber
Mungkin ini berhasil:
Itukah yang kamu inginkan? Semoga ini membantu =)
sumber
docker
biner tersedia di dalam wadah, jelas.docker
dan akses ke soket docker host.