Saya mencoba membangun solusi cadangan dan memulihkan untuk wadah Docker yang bekerja dengan kami.
Saya memiliki gambar dasar Docker yang telah saya buat,, ubuntu:base
dan tidak ingin harus membangunnya kembali setiap kali dengan file Docker untuk menambahkan file ke dalamnya.
Saya ingin membuat skrip yang dijalankan dari mesin host dan membuat wadah baru menggunakan ubuntu:base
gambar Docker dan kemudian menyalin file ke wadah itu.
Bagaimana saya bisa menyalin file dari host ke wadah?
docker
docker-container
pengguna3001829
sumber
sumber
Jawaban:
The
cp
perintah dapat digunakan untuk menyalin file.Satu file tertentu dapat disalin ke wadah seperti:
Satu file spesifik dapat disalin dari wadah seperti:
Untuk penekanan,
mycontainer
adalah wadah ID, bukan sebuah gambar ID.Beberapa file yang terkandung oleh folder
src
dapat disalin ke dalamtarget
folder menggunakan:Referensi: Dokumentasi CLI Docker untuk
cp
Dalam versi Docker sebelum 1.8, hanya mungkin untuk menyalin file dari sebuah wadah ke host. Bukan dari host ke wadah.
sumber
COPY
lebih disukai daripadaADD
saat berlaku.docker cp
untuk menyalin dari wadah ke host berfungsi dengan baik, tetapi ketika menggunakannya untuk menyalin file dari host ke wadah, tidak ada efek ... ada yang tahu mengapa? versi docker: Docker versi 1.10.3, build cb079f6-unsupportedDapatkan nama wadah atau id wadah pendek:
Dapatkan id kontainer lengkap:
Salin file:
CONTOH:
atau
sumber
aufs
tetapi adevicemapper
. Cara termudah untuk memeriksa jalur pemasangan kontainer (saat sedang berjalan) adalah dengan menjalankan perintahmount
./var/lib/docker/aufs/diff/<id>/
/var/lib
untuk saya.find / -name docker
juga tidak membantu.Cara terbersih adalah memasang direktori host pada wadah ketika memulai wadah:
sumber
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
ini adalah operasi satu arah!Berikut ini adalah cara yang cukup buruk untuk melakukannya tetapi berhasil.
sumber
docker commit `docker ps -l -q` ubuntu-with-file
. Jika tidak, perubahan akan hilang (gunakan nama apa pun yang Anda inginkanubuntu-with-file
)docker exec
fitur baru untuk bekerja dengan menjalankan wadah:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
bukan-it
, karena tidak ada TTY ketika menyalurkan dari file.tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
Jika Anda perlu melakukan ini pada wadah yang sedang berjalan, Anda dapat menggunakan docker exec (ditambahkan pada 1.3).
Pertama, temukan nama atau ID wadah:
Dalam contoh di atas kita dapat menggunakan
b9b7400ddd8f
atauelated_hodgkin
.Jika Anda ingin menyalin semua yang ada di
/tmp/somefiles
host ke/var/www
dalam wadah:Kami kemudian dapat mengeksekusi
/bin/bash
dalam wadah dan memverifikasi itu berfungsi:sumber
Buat dockerfile baru dan gunakan gambar yang ada sebagai basis Anda.
Kemudian bangun wadah:
sumber
Solusinya diberikan di bawah ini,
Dari shell Docker,
Dari tuan rumah
File harus disalin secara langsung ke lokasi di mana wadah berada di sistem file.
sumber
Biasanya ada tiga jenis:
Dari wadah ke tuan rumah
Dari host ke wadah
Dari wadah ke wadah campuran 1 dan 2
sumber
Solusi lain untuk menyalin file ke wadah berjalan menggunakan tar:
Menyalin file
foo.sh
ke/tmp
dalam wadah.Sunting: Hapus reduntant
-f
, terima kasih atas komentar Maarten .sumber
-f -
adalah berlebihan sedikit meskipun, perilaku default adalah untuk menulis ke stdout pula.Untuk menyalin file dari host ke menjalankan wadah
Berdasarkan jawaban Erik dan komentar Mikl dan z0r.
sumber
Dengan Docker 1.8,
docker cp
dapat menyalin file dari host ke wadah. Lihat posting blog Docker Mengumumkan Docker 1.8: Kepercayaan Konten, Kotak Alat, dan Pembaruan ke Registri dan Orkestrasi .sumber
docker cp foo.txt mycontainer:/foo.txt
Ini adalah jawaban langsung untuk pertanyaan 'Menyalin file dari host ke wadah Docker' yang dimunculkan dalam pertanyaan ini dalam judul.
Coba
docker cp
. Ini adalah cara termudah untuk melakukan itu dan bekerja bahkan di Mac saya. Pemakaian:Ini akan menyalin file
some-file.txt
di direktori/root
pada mesin host Anda ke dalam wadah Docker yang dinamaisome-docker-container
ke dalam direktori/root
. Sangat dekat dengan sintaks copy aman. Dan seperti yang ditunjukkan pada posting sebelumnya, Anda dapat menggunakannya sebaliknya. Yaitu, Anda juga menyalin file dari wadah ke host.Dan sebelum Anda mengirim tautan ke bawah, silakan masukkan
docker cp --help
. Membaca dokumentasi bisa sangat membantu, kadang-kadang ...Jika Anda tidak menyukai cara itu dan Anda ingin volume data dalam wadah yang sudah Anda buat dan jalankan, maka rekreasi adalah satu-satunya pilihan Anda hari ini. Lihat juga Bagaimana saya bisa menambahkan volume ke wadah Docker yang ada? .
sumber
Saya mencoba sebagian besar (upvoted) solusi di sini tetapi di buruh pelabuhan 17.09 (tahun 2018) tidak ada lagi folder / var / lib / docker / aufs.
Sederhana
docker cp
ini menyelesaikan tugas ini.Bagaimana cara mendapatkan nama_paket?
Ada satu
NAMES
bagian. Jangan gunakan aIMAGE
.sumber
Untuk menyalin file / folder antara wadah dan sistem file lokal, ketikkan perintah:
Sebagai contoh,
Untuk mendapatkan id contianer, ketikkan perintah yang diberikan:
Konten di atas diambil dari docker.com .
sumber
Dengan asumsi wadah sudah berjalan, ketikkan perintah yang diberikan:
Untuk berbagi file menggunakan direktori bersama, jalankan wadah dengan mengetikkan perintah yang diberikan:
Catatan: Masalah dengan izin mungkin muncul karena pengguna wadah tidak sama dengan pengguna host.
sumber
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
tidak akan dihentikan setelah keluar. Jika itu penting bagi Anda (jika Anda menyalin skrip bash, bash akan menolak untuk menjalankannya), Anda harus menjalankanlsof | grep yourfilename
dan membunuhcat
proses yang menyimpan file tersebut.kill $(lsof | grep /path/to/file | sed ...)
. Saya akan berterima kasih atas bantuan Andakill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Ini adalah perintah untuk menyalin data dari Docker ke Host:
Di bawah ini adalah perintah untuk menyalin data dari host ke buruh pelabuhan:
sumber
Di lingkungan buruh pelabuhan, semua kontainer ditemukan di direktori:
/var/lib/docker/aufs/required-docker-id/
Untuk menyalin direktori sumber / file ke bagian mana pun dari wadah, ketikkan perintah yang diberikan:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
sumber
tar
dandocker cp
merupakan kombo yang bagus untuk menyalin segala sesuatu dalam direktori.Buat wadah volume data
Untuk mempertahankan hierarki direktori
Periksa pekerjaanmu
sumber
Jika host adalah CentOS atau Fedora, ada proxy TIDAK di
/var/lib/docker/aufs
dalamnya, tetapi berada di bawah/proc
:Cmd ini akan menyalin semua isi
data
direktori ke/
wadah dengan id "containerid".sumber
/proc
). Juga rentangkan path untuk meletakkan file di tempat lain, bukan hanya root.Dalam hal tidak jelas bagi orang seperti saya apa artinya
mycontainer
di @ h3nrik jawab, itu sebenarnya id wadah. Untuk menyalin fileWarpSquare.mp4
dalam/app/example_scenes/1440p60
dari wadah buruh pelabuhan keluar ke folder saat ini saya menggunakan ini.di mana
docker ps -q -l
menarik id wadah instance yang terakhir keluar. Dalam hal ini bukan wadah keluar Anda bisa mendapatkannya dengandocker container ls
ataudocker ps
sumber
docker ps -a
ataudocker container ls -a
.Banyak yang menemukan pertanyaan ini mungkin sebenarnya memiliki masalah menyalin file ke gambar Docker saat sedang dibuat (saya lakukan).
Dalam hal ini, Anda bisa menggunakan
COPY
perintahDockerfile
yang Anda gunakan untuk membuat gambar.Lihat dokumentasi .
sumber
Anda bisa melacak alamat IP dari mesin lokal Anda menggunakan
Kemudian cukup masukkan ke dalam wadah Docker Anda dan ketik
Dalam kasus apa pun jika Anda tidak memiliki klien dan server SSH diinstal, cukup instal menggunakan:
sumber
Ini adalah onliner untuk menyalin satu file saat menjalankan wadah kucing jantan.
Ini akan menyalin file perang ke direktori webapps dan menjalankan aplikasi Anda dalam waktu singkat.
sumber
Sintaks Penampung:
Dalam File buruh pelabuhan
sumber
Cara terbaik untuk menyalin file ke wadah yang saya temukan adalah memasang direktori pada host menggunakan
-v
opsi perintah docker run.sumber
Ada jawaban yang bagus, tetapi terlalu spesifik. Saya menemukan
docker ps
cara yang bagus untuk mendapatkan id kontainer yang Anda minati. Kemudian lakukanuntuk melihat di mana volume terpasang. Itu
bagi saya, tetapi mungkin jalan yang berbeda tergantung pada OS dan konfigurasi. Sekarang cukup salin file ke jalur itu.
Penggunaan
-v
tidak selalu praktis.sumber
Saya baru saja mulai menggunakan buruh pelabuhan untuk mengkompilasi VLC, inilah yang dapat Anda lakukan untuk menyalin file bolak-balik dari wadah:
Cari file yang dikenal di txt itu dan Anda akan memiliki folder, cd ke sana sebagai root dan voila! salin semua yang kamu inginkan.
Mungkin ada jalan dengan "digabung" di dalamnya, saya kira Anda ingin yang memiliki "diff" di dalamnya.
Juga jika Anda keluar dari wadah dan ingin kembali ke tempat terakhir Anda:
Saya kira itu berguna ketika Anda tidak menyebutkan nama dengan perintah seperti
Tentu metode hacker tapi terus kenapa!
sumber
Sebagai contoh, saya ingin menyalin file saya xxxx / download / jenkins ke tomcat
Saya mulai mendapatkan id dari wadah Tomcat
sumber
Metode favorit saya:
WADAH:
file.txt
atau
sumber
Menurut pendapat saya, Anda tidak harus menyalin file di dalam gambar tetapi Anda dapat menggunakan GIT atau SVN untuk file Anda dan kemudian mengatur volume yang disinkronkan dengan folder lokal. Gunakan skrip saat menjalankan wadah yang dapat memeriksa apakah data sudah ada di folder lokal jika tidak menyalinnya dari repositori GIT. Itu membuat gambar Anda sangat ringan.
sumber