Saya ingin mengekstrak file dari gambar Docker tanpa harus menjalankan gambar.
The docker save
pilihan adalah tidak currrently pilihan yang layak bagi saya seperti itu menyimpan terlalu besar file hanya untuk un-tar file tertentu.
Saya ingin mengekstrak file dari gambar Docker tanpa harus menjalankan gambar.
The docker save
pilihan adalah tidak currrently pilihan yang layak bagi saya seperti itu menyimpan terlalu besar file hanya untuk un-tar file tertentu.
Jawaban:
Anda dapat mengekstrak file dari gambar dengan perintah berikut:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
Menurut docker create
dokumentasi , ini tidak menjalankan wadah:
The
docker create
Perintah menciptakan wadah lapisan ditulisi atas gambar yang ditentukan dan mempersiapkan untuk menjalankan perintah tertentu. ID wadah kemudian dicetak keSTDOUT
. Ini mirip dengandocker run -d
kecuali wadah tidak pernah dimulai. Anda kemudian dapat menggunakandocker start <container_id>
perintah untuk memulai wadah di titik mana pun.
Untuk referensi (jawaban saya sebelumnya), cara yang kurang efisien untuk mengekstraksi file dari gambar adalah sebagai berikut:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Tak satu pun dari yang di atas bekerja untuk saya. Perintah kerja lengkap adalah:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Tanpa tanda kutip cat
dilewatkan tanpa nama file, sehingga tidak tahu harus menunjukkan apa. Juga merupakan ide bagus untuk menghapus wadah setelah perintah selesai.
Jika saya tidak salah, saya percaya bahwa buruh pelabuhan menyimpan file cache yang dibuat di direktori berikut untuk Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
Dari sana Anda harus dapat mengakses sistem file dan mengambil file Anda.
layersize
dan json
, dan juga tidak dapat dibaca pengguna (bahkan jika pengguna dalam grup buruh pelabuhan). /var/lib/docker/aufs/diff
akan berisi file yang saya cari (tetapi dikategorikan bukan oleh id kontainer) dan juga tidak dapat dibaca.
/var/lib/docker/aufs
(tetapi tidak semua direktori lain di /var/lib/docker/
)
Jika menyimpan hasil lengkap docker save
bukan merupakan pilihan, Anda dapat menggunakan saluran pipa untuk mengekstrak hanya file yang diperlukan darinya.
Sayangnya, karena outputnya adalah "tar ter", ini bisa menjadi proses yang sedikit berulang.
Apa yang saya lakukan ketika saya perlu mengekstrak file barusan adalah:
1) Tentukan versi gambar mana yang Anda minati berubah paling baru (bagaimana Anda melakukan ini tergantung pada gambar Anda), dan tanggal pembuatan / penyimpanannya
2) Dapatkan daftar isi lengkap dari output docker save
perintah dengan:
docker save IMAGE_NAME | tar -tvf -
3) Fine layer.tar
file (s) dalam output dari perintah yang sesuai dengan tanggal gambar yang Anda tentukan pada langkah 1. (Anda dapat menambahkan | grep layer.tar
untuk hanya menunjukkan file-file itu)
4) Ekstrak layer.tar
file itu ke standar, dan dapatkan daftar isi file itu:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Verifikasi file yang Anda inginkan terdaftar, dan ekstrak setelah Anda menemukan nama:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Jika ada lebih dari satu layer.tar
file yang cocok dengan tanggal yang Anda cari pada langkah 2/3, Anda mungkin perlu mengulangi langkah 4 untuk masing-masing file sampai Anda menemukan yang benar.
Ganti teks dalam huruf kapital dalam perintah di atas dengan nama gambar yang benar, checksum dan nama file untuk kasus Anda.