Menyalin file dari Docker container untuk menjadi tuan rumah
I'm berpikir untuk menggunakan Docker untuk membangun ketergantungan pada Continuous Integration (CI) server, sehingga saya don't harus menginstal semua runtimes dan perpustakaan di agen sendiri.
Untuk mencapai ini, saya akan perlu untuk menyalin membangun artefak yang dibangun di dalam kontainer kembali ke host. Itu mungkin?
1429
16
Dalam rangka untuk menyalin file dari satu wadah ke host, anda dapat menggunakan perintah
Berikut ini's contoh:
Di sini goofy_roentgen adalah wadah nama saya dapatkan dari perintah berikut:
Anda juga dapat menggunakan (bagian dari) Container ID. Perintah berikut adalah setara dengan yang pertama
Anda tidak perlu menggunakan
docker menjalankan
Anda dapat melakukannya dengan
docker membuat
Dari docs Docker membuat perintah membuat ditulisi wadah lapisan atas yang ditentukan gambar dan mempersiapkan untuk menjalankan perintah yang ditentukan. ID wadah ini kemudian dicetak ke STDOUT. Hal ini mirip dengan docker run-d kecuali wadah ini tidak pernah dimulai.
Jadi, anda dapat melakukan
Di sini, anda tidak pernah memulai wadah. Yang tampak bermanfaat untuk saya.
Mount "volume" dan copy artefak ke sana:
Me-Mount volume, copy artefak, menyesuaikan pemilik id dan group id:
TLDR;
Jika anda don't telah berjalan kontainer, hanya sebuah gambar, dan dengan asumsi anda ingin menyalin hanya file teks, anda bisa melakukan sesuatu seperti ini:
Sebagian besar jawaban tidak menunjukkan bahwa wadah harus dijalankan sebelum
docker cp
akan bekerja:Saya posting ini untuk siapa saja yang menggunakan Docker untuk Mac. Ini adalah apa yang bekerja untuk saya:
Perhatikan bahwa ketika saya me-mount menggunakan
-v
yangcadangan
direktori yang secara otomatis dibuat.Saya berharap hal ini berguna untuk seseorang suatu hari nanti. :)
Secara lebih umum sebagai solusi, ada's CloudBees plugin untuk Jenkins untuk membangun di dalam kontainer Docker. Anda dapat memilih gambar menggunakan Docker registry atau menetapkan Dockerfile untuk membangun dan menggunakan.
It'll gunung workspace ke dalam wadah sebagai volume (sesuai dengan user), ditetapkan sebagai direktori kerja anda, melakukan apapun perintah anda permintaan (dalam wadah). Anda juga dapat menggunakan docker-alur kerja plugin (jika anda memilih kode over UI) untuk melakukan hal ini, dengan gambar.dalam() {} perintah.
Pada dasarnya semua ini, panggang ke CI/CD server dan kemudian beberapa.
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
Jika anda hanya ingin menarik file dari gambar (bukannya menjalankan wadah) anda dapat melakukan ini:
docker run --rm <gambar> kucing <sumber> > <local_dest>
Ini akan membawa wadah, menulis file baru, kemudian menghapus wadah. Satu kelemahan, bagaimanapun, adalah bahwa hak akses file, dan tanggal modifikasi tidak akan diawetkan.
Saya menggunakan PowerShell (Admin) dengan perintah ini.
Contoh
Dengan rilis dari Docker 19.03, anda dapat melewatkan menciptakan wadah dan bahkan membangun sebuah citra. Ada's pilihan dengan BuildKit didasarkan membangun untuk mengubah output tujuan. Anda dapat menggunakan ini untuk menulis hasil dari membangun untuk direktori lokal anda, bukan ke dalam sebuah gambar. E. g. berikut ini's yang membangun dari pergi biner:
Dari penjelasan di atas Dockerfile, I'm bangunan
artefak
panggung yang hanya mencakup file yang saya inginkan untuk ekspor. Dan baru diperkenalkan--output
bendera memungkinkan saya menulis ke direktori lokal, bukan gambar. Hal ini perlu dilakukan dengan BuildKit mesin yang kapal dengan 19.03:Setelah membangun menyelesaikan
aplikasi
biner diekspor:Docker memiliki pilihan lain untuk
--output
bendera didokumentasikan di hulu BuildKit repo: https://github.com/moby/buildkit#outputMembuat jalan di mana anda ingin menyalin file dan kemudian menggunakan:
Membuat direktori data pada sistem host (di luar wadah) dan me-mount ke direktori yang terlihat dari dalam wadah. Ini tempat file-file di lokasi yang dikenal pada sistem host, dan membuatnya mudah untuk alat dan aplikasi pada sistem host untuk mengakses file
Anda dapat menggunakan
mengikat
bukanvolume
jika anda ingin me-mount hanya satu folder, tidak membuat penyimpanan khusus untuk wadah:docker membangun . -t <gambar>
2. Menjalankan gambar dan mengikat saat ini $(pwd) direktori mana app.py toko-toko dan peta ke /root/contoh/ di dalam wadah.docker menjalankan-mount type=mengikat,sumber="$(pwd)" target=/root/contoh/ <gambar> python app.py