Perlu memasukkan beberapa file ke dalam atau keluar dari wadah Docker? docker cp
perintah memungkinkan Anda menyalin antara sistem file host dan penampung sehingga Anda dapat menambahkan detail konfigurasi, membuat cadangan, dan memulihkan data yang ada.
Sintaks Dasar
docker cp
menerima jalur sumber dan tujuan sebagai dua argumennya:
docker cp example.txt my-container:/example.txt
Di sini example.txt
sedang disalin dari direktori kerja Anda ke /example.txt
di my-container
wadah. Anda dapat membalikkan dua argumen untuk menyalin /example.txt
keluar dari wadah dan masuk ke direktori kerja Anda.
Argumen yang mereferensikan jalur penampung harus diawali dengan ID penampung atau nama diikuti dengan titik dua (:
). Anda dapat menemukan ID atau nama container yang sedang berjalan dengan docker ps
.
Setiap docker cp
perintah membutuhkan satu jalur sistem file lokal dan satu jalur wadah – Anda tidak dapat langsung menyalin di antara dua wadah. Gunakan prosedur multi-langkah jika Anda perlu melakukannya, salin dulu dari wadah sumber ke sistem file Anda, lalu dari jalur lokal baru ke wadah target.
Menyalin Seluruh Direktori
docker cp
dapat menyalin direktori secara rekursif juga:
docker cp /home/demo/website apache-container:/var/www/html/.
Docker akan menyalin semuanya di /home/demo/website
dan transfer ke /var/www/html
.
Menyalin Perilaku
Saat Anda menyalin file, Docker membuat file baru di tujuan jika belum ada. File yang ada ditimpa dengan konten baru. Saat direktori tujuan, file akan disalin ke dalamnya menggunakan nama file sumber. Pengecualian adalah ketika tujuan yang ditentukan diakhiri dengan /
, yang menunjukkan direktori, tetapi jalurnya belum ada. Dalam skenario ini, kesalahan akan muncul.
Prosesnya sedikit lebih rumit untuk salinan direktori. Direktori baru akan dibuat di tujuan dengan isi direktori sumber, jika jalur tujuan belum ada. Jika memang ada, perilakunya akan berbeda tergantung pada apakah Anda telah menyertakan /.
. di akhir atau tidak komponen di jalur.
/.
hadir – Sumber direktori disalin ke direktori tujuan yang ada./.
tidak ada – konten dari direktori sumber disalin ke tujuan.
Perbedaan halus menentukan apakah subdirektori baru dibuat di dalam tujuan.
Batasan Perintah
Terlepas dari namanya, docker cp
bukan implementasi lengkap dari cp
perintah cangkang. cp
bendera tidak didukung, kecuali untuk -a
dan -L
:
-a
– Mode arsip, yang mempertahankan detail pengguna dan grup pada file yang disalin.-L
– Ikuti symlink di direktori sumber untuk menyalin konten target tautan, bukan tautan itu sendiri.
Untuk kasus penggunaan lanjutan yang memerlukan penyalinan selektif, Anda harus mundur menggunakan pendekatan yang berbeda.
Menggunakan Bind Mount untuk Menyalin File
Volume Docker menyediakan cara lain untuk memindahkan file antara container dan host Anda. Mengikat pemasangan direktori lokal ke dalam wadah memungkinkan Anda mengakses isinya dari sistem file host Anda, menghilangkan kebutuhan untuk menggunakan docker cp
.
docker run -v /example/host/directory:/container/path my-image:latest
Isi /example/host/directory
path dipasang ke sistem file container di /container/path
. Anda dapat berinteraksi dengan file-file ini di luar Docker menggunakan alat yang sudah dikenal seperti cp
, rsync
, dan browser file grafis Anda.
Teknik ini hanya berguna saat Anda bekerja dengan satu direktori container. Ini tidak berfungsi dengan baik saat Anda menyalin dari lokasi sembarang karena Anda perlu mengetahui jalur yang akan Anda gunakan sebelumnya, saat penampung dibuat.
Anda juga harus berhati-hati dengan izin sistem file:file yang dibuat di dalam wadah biasanya dimiliki oleh root
. Ini dapat membuat skenario canggung pada host di mana Anda tidak dapat mengedit atau menghapus file di dalam direktori terikat. Gunakan chown
perintah pada host dan di dalam wadah untuk mengalihkan kepemilikan tergantung pada lingkungan jika perlu.
Bagaimana Dengan COPY
di Dockerfiles?
docker cp
terkadang bingung dengan COPY
instruksi di Dockerfiles. Penting untuk diketahui bahwa kedua fitur ini memiliki kasus penggunaan yang sangat berbeda.
COPY
tidak dapat digunakan untuk memindahkan file antara host Anda dan container yang sedang berjalan. Ini untuk memasukkan file ke dalam gambar selama proses pembuatan:
COPY /home/me/my-website /var/www/html/.
Di sini kode sumber situs web disalin ke dalam gambar sebagai bagian dari build. Ini adalah proses satu kali. Setiap penampung yang dimulai dari gambar akan menyertakan sumber situs web seperti saat Anda menjalankan docker build
.
docker cp
memungkinkan Anda mengganti kode sumber itu dengan versi yang lebih baru setelah wadah berjalan. COPY
instruksi untuk membuat file menjadi bagian dari gambar statis; cp
perintah berinteraksi dengan wadah langsung.
Kapan Menyalin File Dengan Docker?
Menyalin file secara manual dari host Anda ke wadah Docker, atau sebaliknya, seharusnya jarang terjadi. Gambar dimaksudkan untuk mandiri sehingga harus dilengkapi dengan semua yang Anda butuhkan untuk memulai sebuah instance. Konfigurasi biasanya ditangani melalui variabel lingkungan.
Wadah yang perlu menyimpan data secara terus-menerus harus menggunakan volume Docker. Volume memungkinkan data untuk hidup lebih lama dari satu wadah apa pun sehingga Anda tidak perlu docker cp
secara manual sebelum mengganti sebuah instance. Saat Anda membuat cadangan, salin volume dari host Anda, alih-alih mengeluarkan file dari wadah.
docker cp
paling berguna saat men-debug kontainer atau bekerja di lingkungan pengembangan. Terkadang Anda perlu secara manual menyuntikkan file konfigurasi sementara atau mengeluarkan log yang terkubur. Menggunakan docker cp
lebih cepat dan lebih nyaman daripada membangun kembali seluruh gambar setiap kali Anda membuat perubahan kode.
Selalu ingat bahwa file disalin ke wadah hanya akan bertahan selama wadah itu hidup. Memulai wadah lain dari gambar yang sama akan memberi Anda catatan yang bersih, tanpa file yang Anda tambahkan dengan docker cp
.
Ringkasan
docker cp
memungkinkan Anda memindahkan file antara host dan container Docker Anda. Ini bekerja dengan file dan direktori tetapi tidak memiliki sebagian besar fungsionalitas lanjutan di cp
berbasis shell perintah.
Penggunaan reguler docker cp
menunjukkan potensi penyimpangan dari praktik terbaik kontainer. Adalah bijaksana untuk memperlakukannya sebagai alat kenyamanan untuk penggunaan pengembangan, daripada bagian integral dari bekerja dengan kontainer. Persistensi file jangka panjang harus diimplementasikan dengan volume karena ini adalah komponen kelas satu dalam ekosistem Docker.