Apa itu .dockerenv dan .dockerinit?


6

Apa sajakah .dockerenvdan .dockerinitfile - file di root dari filesystem kontainer saya? Bagaimana mereka digunakan? Apakah ada dokumentasi pada file-file ini?

root@18ceee4f9041:/# ls -al /
total 72
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 .
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 ..
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerenv
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerinit

Orang lain telah mengajukan pertanyaan serupa, tetapi saya tidak dapat menemukan jawaban:

Saya bertanya karena saya sedang mengerjakan bug di alat pelaksana docker saya yang disebut scuba . Anda dapat meneruskan --userke docker rununtuk mengatur UID proses dalam sebuah wadah, tetapi tidak memiliki entri di / etc / passwd, jadi saya sedang menyelidiki opsi untuk membuat pengguna saat startup wadah.

(Diposting silang di Stack Overflow , di mana mungkin ditutup.)

Jawaban:


6

AFAIK tidak ada dokumentasi resmi tentang mereka.

File-file itu di mana hanya digunakan oleh driver eksekusi LXC lama dan usang . Itu adalah hack yang diperlukan oleh buruh pelabuhan ketika menggunakan LXC untuk menjalankan kontainer.

Itu .dockerinitsemacam proses init . Itu adalah biner yang dijalankan oleh lxc-attachperintah yang dipanggil saat memulai sebuah wadah. Itu bertanggung jawab untuk mengatur lingkungan, pengguna dan direktori kerja dan kemudian jalankan entrypoint / cmd Anda.

The .dockerenvterkandung variabel lingkungan didefinisikan dalam wadah. Mereka digunakan untuk mengatur variabel lingkungan dengan benar setelah lxc-attach. File ini dibaca oleh .dockerinitproses .

Baru libcontainer / runc driver ( sopir diaktifkan secara default ) tidak menggunakan file-file ini. Anda akan menemukan mereka kosong di wadah Anda. Bahkan, dukungan LXC baru-baru ini dihapus dari cabang pengembangan buruh pelabuhan .

Jadi mungkin file-file ini pada akhirnya akan hilang di masa depan, walaupun saat ini banyak digunakan oleh aplikasi untuk mendeteksi keberadaan buruh pelabuhan.


1
Ketidaktelitian kecil: Menurut kode sumber, itu adalah titik pemasangan, ditentukan dalam inti Docker, tidak spesifik untuk driver LXC.
— Daniel B

1
Ya kamu benar. File-file itu adalah bagian dari daftar poin mount yang dibuat sebagai file kosong di inti Docker saat membuat FS root. Tetapi kedua file / mountpoint tertentu hanya digunakan oleh LXC.
— zuazo

Terima kasih untuk ini. Bisakah Anda melihat hasil edit saya tentang "scuba"? Juga, dapatkah Anda menjelaskan "Itu adalah tanggung jawab untuk mengatur ... pengguna" ? Ini relevan dengan masalah saya.
— Jonathon Reinhart

Ini menetapkan nama pengguna yang diteruskan ke -uargumen. Anda dapat membaca implementasinya di sini .
— zuazo

Mengenai masalah dengan proyek scuba Anda, lihat beberapa solusi untuk masalah id pengguna di sini: github.com/docker/docker/issues/7198
— zuazo

1

Untuk mengetahui, apakah kode mereka berjalan di dalam lingkungan buruh pelabuhan, itu populer untuk menguji keberadaan file /.dockerinitatau /.dockerenvfile tersebut.

Karena file dockerinit telah dihapus dalam versi yang lebih baru, ide terbaik seharusnya sekarang adalah untuk memeriksa keberadaan file dockerenv.

Contoh implementasi pemeriksaan semacam itu dari kode kami:

if ! [ -f /.dockerenv ] ; then
  echo "Not running inside docker, exiting to avoid data damage." >&2
  exit 1
fi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.