Pasang isi kontainer Docker dalam sistem file host

24

Saya ingin dapat memeriksa isi wadah Docker (hanya baca). Cara yang elegan untuk melakukan ini adalah dengan me-mount konten kontainer dalam direktori. Saya berbicara tentang pemasangan konten kontainer pada host, bukan tentang pemasangan folder pada host di dalam wadah.

Saya dapat melihat bahwa ada dua driver penyimpanan di Docker sekarang: aufs dan btrfs. Instalasi Docker saya sendiri menggunakan btrfs, dan menjelajah ke / var / lib / docker / btrfs / subvolume menunjukkan kepada saya satu direktori per wadah Docker pada sistem. Namun ini adalah detail implementasi Docker dan rasanya salah untuk me - mount direktori ini di tempat lain.

Apakah ada cara yang tepat untuk melakukan ini, atau apakah saya perlu menambal Docker untuk mendukung jenis mount ini?

dflemstr
sumber
Mengapa salah untuk mengikat mount ini di tempat lain?
Michael Hampton
1
Karena lokasi penyimpanan adalah detail implementasi. Docker hari menambahkan driver penyimpanan lain, lokasi akan bergerak. Saya perlu membuat ini semi-otomatis dan alangkah baiknya menggunakan API publik untuk alasan itu.
dflemstr
2
Mungkin layak mempertimbangkan bekerja di nsenter (atau buruh pelabuhan-masuk) untuk mencapai tujuan Anda; tentu saja ada kendala karena harus memeriksa kode / alat inspeksi di dalam wadah.
VladFr
Apakah tidak ada cara menginstruksikan Linux untuk memasang melintasi batas kontainer?
dflemstr
@dflemstr ya, ada, --volumes-from agak melakukan itu, tampaknya untuk me-mount penyatuan direktori dari gambar dasar wadah lainnya dan volume, tetapi perilaku ini tidak didokumentasikan afaik
Tarnay Kálmán

Jawaban:

10

Lihatlah docker export.

Untuk dengan cepat daftar file dalam wadah Anda:

docker export CONTAINER|tar -t

Untuk mengekspor:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Atau untuk melihat file:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 mendukung cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

pembaruan: Anda harus ssh ke mesin buruh pelabuhan saat menjalankan ini.

laktak
sumber
2
Gambar saya cukup besar (ratusan MiB) sehingga melakukan ini untuk mengambil file individu terlalu banyak overhead. Ini akan membuat file multi-ratus-megabyte setiap saat.
dflemstr
@dflemstr menggunakan baris dengan tar x PATH-IN-CONTAINER, itu hanya akan mengekstrak file yang Anda butuhkan.
laktak
... tetapi seluruh tararsip masih dibuat di daemon Docker, dan dibutuhkan beberapa menit untuk membuat ...
dflemstr
@ dflemstr tidak yakin apa pengaturan Anda tetapi mis. docker export ubuntu|tar -t|grep etc/networkmembutuhkan waktu 3 detik untuk saya.
laktak
Anda mungkin menjalankannya pada mesin yang sama dengan daemon Docker sehingga Anda tidak perlu melakukan transfer jaringan, dan ubuntugambarnya sangat kecil ...
dflemstr
3

Anda dapat menggunakan docker commit untuk mempertahankan kondisi wadah Anda saat ini di gambar baru, dan memulai wadah interaktif dari gambar ini untuk memeriksa isinya.

Dari dokumentasi:

Ini dapat berguna untuk melakukan perubahan atau pengaturan file kontainer ke gambar baru. Ini memungkinkan Anda men-debug wadah dengan menjalankan shell interaktif, atau untuk mengekspor dataset yang berfungsi ke server lain.

Semoga ini membantu.

Eric Citaire
sumber
2

Anda dapat menggunakan nsenter untuk menjalankan program inspeksi Anda (yang mungkin harus sudah termasuk dalam wadah) di dalam wadah / namespace. Tetapi untuk me-mount sistem file kontainer seperti yang terlihat di dalamnya Anda harus me-mount gambar asli dan semua layer jika aufs, atau tindakan setara untuk mapper perangkat, btrfs dan mesin penyimpanan lain (masa depan) yang digunakan, berbeda dalam setiap kasus. Mungkin akan lebih efisien untuk membiarkan buruh pelabuhan melakukan pekerjaan untuk Anda, persis seperti yang seharusnya dilakukan, dan menggunakan nsenter untuk melakukan pemeriksaan di dalam wadah.

Ada beberapa pendekatan lain. diff buruh pelabuhan akan menunjukkan file apa yang berubah dalam wadah itu, jika Anda ingin melihat apa yang berubah dan bukan apa yang ada di gambar asli.

Dan untuk data yang harus gigih dan dapat diperiksa, mungkin pola yang lebih baik adalah memilikinya dalam volume dalam wadah, dan membuatnya dipasang pada sistem file nyata, atau dalam wadah data murni, atau dalam wadah yang sama, tetapi Anda dapat meluncurkan wadah lain dengan program inspeksi yang memasang volume-volume itu darinya.

gmuslera
sumber
1

EDIT: Saya mencoba solusi di bawah ini dan sayangnya itu tidak berhasil untuk saya dalam praktek. Filesystem yang di-mount tidak secara akurat mencerminkan filesystem kontainer (bahkan dengan cache=no). Saya tidak yakin apakah ini masalah mendasar atau saya melakukan sesuatu yang salah.

Anda dapat menginstal sshd pada gambar buruh pelabuhan dan menggunakan docker execuntuk menjalankan layanan ssh ( /usr/sbin/sshd -D) pada wadah buruh pelabuhan (perhatikan bahwa port SSH 22 dari wadah buruh pelabuhan perlu dibuka).

Kemudian, gunakan docker cpuntuk menyalin kunci ssh publik Anda ke /root/.ssh/authorized_keysdirektori wadah buruh pelabuhan.

Terakhir, gunakan docker inspectuntuk menemukan alamat IP wadah dan pasang sistem file wadah menggunakan

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Anda harus menulis naskah untuk membuatnya bekerja dengan nyaman dalam praktik.

mnieber
sumber