Saya ingin mengekstrak file dari gambar Docker tanpa harus menjalankan gambar.
The docker savepilihan 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 savepilihan 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 createPerintah menciptakan wadah lapisan ditulisi atas gambar yang ditentukan dan mempersiapkan untuk menjalankan perintah tertentu. ID wadah kemudian dicetak keSTDOUT. Ini mirip dengandocker run -dkecuali 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 catdilewatkan 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.
layersizedan json, dan juga tidak dapat dibaca pengguna (bahkan jika pengguna dalam grup buruh pelabuhan). /var/lib/docker/aufs/diffakan 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 savebukan 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 saveperintah dengan:
docker save IMAGE_NAME | tar -tvf -
3) Fine layer.tarfile (s) dalam output dari perintah yang sesuai dengan tanggal gambar yang Anda tentukan pada langkah 1. (Anda dapat menambahkan | grep layer.taruntuk hanya menunjukkan file-file itu)
4) Ekstrak layer.tarfile 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.tarfile 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.