Menurut docker createdokumentasi , 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
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.
Jawaban:
Anda dapat mengekstrak file dari gambar dengan perintah berikut:
Menurut
docker create
dokumentasi , ini tidak menjalankan wadah:Untuk referensi (jawaban saya sebelumnya), cara yang kurang efisien untuk mengekstraksi file dari gambar adalah sebagai berikut:
sumber
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.sumber
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.
sumber
layersize
danjson
, 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: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:5) Verifikasi file yang Anda inginkan terdaftar, dan ekstrak setelah Anda menemukan nama:
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.
sumber