Ekstrak file dari gambar buruh pelabuhan?


24

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.


Distro apa yang Anda gunakan?
ryekayo

@ryekayo: Ubuntu 14, docker 1.12.4 (api 1.24)
BlakBat

Jawaban:


21

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 ke STDOUT. Ini mirip dengan docker run -dkecuali wadah tidak pernah dimulai. Anda kemudian dapat menggunakan docker 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

3
Anda mungkin ingin naik-naik titik masuk. docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Andrew

1
Ini menjalankan gambar, yang secara khusus tidak ingin saya lakukan sebagaimana dinyatakan dalam pertanyaan saya.
BlakBat

Ah, itu poin bagus. Saya setuju jawaban saya saat ini tidak memuaskan.
bbc

1
@BlakBat Apakah jawaban yang diperbarui ini cocok untuk Anda? Saya kira saya harus membuat jawaban baru tetapi sudah selesai sekarang.
bbc

1
@ bbc Jawaban yang diperbarui ini sebenarnya tidak memulai wadah (inti dari pertanyaan), dan tidak perlu menjadi root.
BlakBat

2

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.


Perintah yang Anda maksudkan hanya akan bekerja tergantung pada buruh pelabuhan dan seberapa benar ENTRYPOINT / CMD diatur di Dockerfile; ini tidak ada hubungannya dengan mengutip. Anda juga mengatakan untuk menghapus wadah, namun Anda menentukan --rm. Terakhir, ketika saya memposting pertanyaan saya, saya menetapkan "tanpa harus menjalankan gambar" dan tidak ada jawaban yang merupakan solusi dengan mempertimbangkan hal ini.
BlakBat

1
Terlepas dari CMD dan ENTRYPOINT yang ditetapkan di Dockerfile saya menimpa keduanya, jadi itu akan selalu bekerja (di Linux tentu saja). Apa yang Anda maksud dengan "tergantung pada buruh pelabuhan"? Pengaturan, versi, env, apa? Pertanyaan Anda tidak benar karena gambar tidak dapat dieksekusi, hanya kontainer yang bisa. Saya pikir tidak ada jawaban yang benar, Anda harus berurusan dengan banyak file atau membuat wadah sementara. --rm menghapus wadah sementara, jawaban orang lain meninggalkan sampah pada disk Anda.
sekrett

1

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.


Nggak. Direktori itu hanya berisi 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.
BlakBat

Beri aku beberapa dan aku akan mencarinya. Saya tahu pasti ada cara untuk mengambil file tanpa memasuki wadah atau menjalankannya.
ryekayo

Dengan tidak terbaca, bagaimana ini ditampilkan? Saya telah menemukan contoh di mana Anda dapat menarik file teks dari wadah dengan pergi ke direktori / var / lib / docker / aufs / diff / *
ryekayo

Kesalahanku. Pengguna dapat mengakses /var/lib/docker/aufs(tetapi tidak semua direktori lain di /var/lib/docker/)
BlakBat

Bisakah Anda mengakses sebagai root?
ryekayo

0

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.

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.