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.)

Jonathon Reinhart
sumber

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.

zuazo
sumber
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
pengguna2291758
sumber