Pertanyaan saya terkait dengan pertanyaan tentang menyalin file dari container ke host; Saya memiliki Dockerfile yang mengambil dependensi, mengompilasi artefak build dari sumber, dan menjalankan file yang dapat dieksekusi. Saya juga ingin menyalin artefak build (dalam kasus saya ini .zip
diproduksi oleh sbt dist
in '../ target / `, tetapi menurut saya pertanyaan ini juga berlaku untuk toples, binari, dll.
docker cp
bekerja pada kontainer, bukan gambar; apakah saya perlu memulai penampung hanya untuk mendapatkan file darinya? Dalam skrip, saya mencoba menjalankan /bin/bash
mode interaktif di latar belakang, menyalin file keluar, dan kemudian mematikan penampungnya, tetapi ini tampaknya kludgey. Apakah ada cara yang lebih baik?
Di sisi lain, saya ingin menghindari pembongkaran .tar
file setelah menjalankan docker save $IMAGENAME
hanya untuk mengeluarkan satu file (tapi sepertinya itu opsi yang paling sederhana, jika paling lambat, saat ini).
Saya akan menggunakan volume buruh pelabuhan, misalnya:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
tetapi saya menjalankan boot2docker
OSX dan saya tidak tahu cara menulis langsung ke sistem file host mac saya (volume baca-tulis meningkat di dalam VM boot2docker saya, yang berarti saya tidak dapat dengan mudah membagikan skrip untuk diekstrak blah.zip
dari gambar dengan orang lain.
sumber
create
perintahnya ditambahkan / dihapus (tidak ada di 1.01)docker create
diperkenalkan di buruh pelabuhan 1.3, blog.docker.com/2014/10/…docker cp $id:path > local-tar-file
bekerja dengan sempurna.Sayangnya sepertinya tidak ada cara untuk menyalin file langsung dari image Docker. Anda perlu membuat penampung terlebih dahulu, lalu menyalin file dari penampung.
Namun, jika gambar Anda berisi
cat
perintah (dan akan dilakukan dalam banyak kasus), Anda dapat melakukannya dengan satu perintah:Jika gambar Anda tidak berisi
cat
, cukup buat wadah dan gunakandocker cp
perintah seperti yang disarankan dalam jawaban Igor.sumber
Opsi yang jauh lebih cepat adalah menyalin file dari penampung yang sedang berjalan ke volume yang terpasang:
** VS **
sumber
cat a >b
vscp a b
memiliki waktu yang sama seperti yang ditunjukkan di sini. Selain itu, jika jalur sumber dan jalur tujuan berada pada sistem file yang berbeda, kedua contoh tersebut akan mengarah ke salinan byte-untuk-byte penuh.Komentar orang tua sudah menunjukkan cara menggunakan kucing . Anda juga bisa menggunakan tar dengan cara yang sama:
sumber
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
ingin menyediakan solusi satu baris
edit: container bahkan tidak harus dijalankan dalam solusi ini
sumber
Jawaban (singkat) lain untuk masalah ini:
sumber
Saya menggunakan boot2docker di MacOS. Saya dapat meyakinkan Anda bahwa skrip berdasarkan "docker cp" bersifat portabel. Karena setiap perintah direlay di dalam boot2docker tetapi aliran biner diteruskan kembali ke klien baris perintah buruh pelabuhan yang berjalan di mac Anda. Jadi operasi tulis dari klien buruh pelabuhan dijalankan di dalam server dan ditulis kembali ke contoh klien pelaksana!
Saya berbagi skrip cadangan untuk volume buruh pelabuhan dengan wadah buruh pelabuhan apa pun yang saya sediakan dan skrip cadangan saya diuji di linux dan MacOS dengan boot2docker. Cadangan dapat dengan mudah dipertukarkan antar platform. Pada dasarnya saya menjalankan perintah berikut di dalam skrip saya:
Saya telah memindahkan arsip antara penampung linux dan penampung mac saya tanpa penyesuaian apa pun pada skrip cadangan atau pemulihan. Jika ini yang Anda inginkan, Anda dapat menemukan seluruh skrip tutorial di sini: blacklabelops / jenkins
sumber
Anda dapat mengikat jalur lokal di host ke jalur di penampung, lalu
cp
file yang diinginkan ke jalur tersebut di akhir skrip Anda.Maka tidak perlu menyalin setelahnya.
sumber