Saya sedang berpikir untuk menggunakan Docker untuk membangun dependensi saya pada server Continuous Integration (CI), sehingga saya tidak perlu menginstal semua runtimes dan pustaka pada agen itu sendiri.
Untuk mencapai ini saya perlu menyalin artefak yang dibangun di dalam wadah kembali ke host. Apakah itu mungkin?
docker
docker-container
file-copying
pengguna2668128
sumber
sumber
Jawaban:
Untuk menyalin file dari wadah ke host, Anda dapat menggunakan perintah
Ini sebuah contoh:
Di sini goofy_roentgen adalah nama kontainer yang saya dapatkan dari perintah berikut:
Anda juga dapat menggunakan (bagian dari) ID Kontainer . Perintah berikut ini setara dengan yang pertama
sumber
docker ps -alq
.docker cp ...
docker cp -L
menyalin symlinkAnda tidak perlu menggunakan
docker run
.Anda bisa melakukannya dengan
docker create
.Dari dokumen :
Jadi, Anda bisa melakukan:
Di sini, Anda tidak pernah memulai wadah. Itu terlihat bermanfaat bagi saya.
sumber
-ti
wajib danbash
wajib?Pasang "volume" dan salin artefak ke sana:
Kemudian ketika build selesai dan container tidak lagi berjalan, ia telah menyalin artefak dari build ke
artifacts
direktori pada host.Edit
Peringatan: Ketika Anda melakukan ini, Anda dapat mengalami masalah dengan id pengguna pengguna buruh pelabuhan yang cocok dengan id pengguna pengguna yang berjalan saat ini. Artinya, file dalam
/artifacts
akan ditampilkan sebagai milik pengguna dengan UID dari pengguna yang digunakan di dalam wadah buruh pelabuhan. Cara mengatasi hal ini adalah dengan menggunakan UID pengguna panggilan:sumber
chown
perintah untuk mencocokkan id pengguna dan id grup di mesin host.Pasang volume, salin artefak, sesuaikan id pemilik dan id grup:
sumber
TLDR;
Deskripsi
docker run
dengan volume host,chown
artefak,cp
artefak ke volume host:Trik ini berhasil karena
chown
doa dalam heredoc dibutuhkan$(id -u):$(id -g)
nilai dari luar container yang sedang berjalan; yaitu tuan rumah buruh pelabuhan.Manfaatnya adalah:
docker container run --name
ataudocker container create --name
sebelumnyadocker container rm
mengejarnyasumber
cp
dan jawaban berbasis volume. Juga, untukid
trik kepemilikan, kadangSebagian besar jawaban tidak menunjukkan bahwa wadah harus dijalankan sebelum
docker cp
berfungsi:sumber
Windows Hyper-V
, tampaknya perlu untuk menghentikan wadah sebelum menyalin file .Jika Anda tidak memiliki wadah yang sedang berjalan, hanya sebuah gambar, dan dengan asumsi Anda ingin menyalin hanya file teks, Anda bisa melakukan sesuatu seperti ini:
sumber
Saya memposting ini untuk siapa saja yang menggunakan Docker untuk Mac. Inilah yang bekerja untuk saya:
Perhatikan bahwa ketika saya gunung menggunakan
-v
yangbackup
direktori secara otomatis dibuat.Saya harap ini berguna bagi seseorang suatu hari nanti. :)
sumber
volumes
perintah di root config.yml, agar volume dapat diakses oleh banyak kontainer.Jika Anda hanya ingin menarik file dari gambar (alih-alih wadah yang sedang berjalan) Anda dapat melakukan ini:
docker run --rm <image> cat <source> > <local_dest>
Ini akan memunculkan wadah, menulis file baru, lalu menghapus wadah. Namun satu kelemahannya adalah bahwa izin file dan tanggal modifikasi tidak akan dipertahankan.
sumber
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
sumber
Dengan rilis Docker 19.03, Anda dapat melewati pembuatan wadah dan bahkan membangun gambar. Ada opsi dengan buildKit berbasis build untuk mengubah tujuan output. Anda dapat menggunakan ini untuk menulis hasil build ke direktori lokal Anda daripada menjadi gambar. Misalnya, ini adalah build dari binary go:
Dari Dockerfile di atas, saya sedang membangun
artifact
panggung yang hanya menyertakan file yang ingin saya ekspor. Dan--output
bendera yang baru diperkenalkan memungkinkan saya menulisnya ke direktori lokal, bukan gambar. Ini perlu dilakukan dengan mesin BuildKit yang dikirimkan dengan 19.03:Setelah pembangunan selesai
app
biner diekspor:Docker memiliki opsi lain untuk
--output
bendera yang didokumentasikan dalam repo BuildKit hulu mereka: https://github.com/moby/buildkit#outputsumber
Sebagai solusi yang lebih umum, ada plugin CloudBees untuk Jenkins untuk dibangun di dalam wadah Docker . Anda dapat memilih gambar untuk digunakan dari registri Docker atau menentukan Dockerfile untuk dibangun dan digunakan.
Ini akan memasang ruang kerja ke dalam wadah sebagai volume (dengan pengguna yang sesuai), mengaturnya sebagai direktori kerja Anda, melakukan perintah apa pun yang Anda minta (di dalam wadah). Anda juga dapat menggunakan plugin docker-workflow (jika Anda lebih suka kode daripada UI) untuk melakukan ini, dengan perintah image.inside () {}.
Pada dasarnya semua ini, dimasukkan ke server CI / CD Anda dan kemudian beberapa.
sumber
Saya menggunakan PowerShell (Admin) dengan perintah ini.
Contoh
sumber
Pilihan lain yang baik adalah pertama membangun wadah dan kemudian menjalankannya menggunakan flag -c dengan shell interpreter untuk menjalankan beberapa perintah
Perintah di atas melakukan ini:
-i = jalankan wadah dalam mode interaktif
--rm = menghapus wadah setelah eksekusi.
-v = membagikan folder sebagai volume dari jalur host Anda ke jalur kontainer.
Akhirnya, / bin / sh -c memungkinkan Anda memperkenalkan perintah sebagai parameter dan perintah itu akan menyalin file pekerjaan rumah Anda ke jalur wadah.
Saya harap jawaban tambahan ini dapat membantu Anda
sumber
Buat direktori data pada sistem host (di luar wadah) dan pasang ini ke direktori yang terlihat dari dalam wadah. Ini menempatkan file di lokasi yang diketahui pada sistem host, dan memudahkan alat dan aplikasi pada sistem host untuk mengakses file
sumber
Buat jalur tempat Anda ingin menyalin file dan kemudian gunakan:
sumber
Anda dapat menggunakan
bind
sebagai gantivolume
jika Anda ingin memasang hanya satu folder, bukan membuat penyimpanan khusus untuk sebuah wadah:Bangun gambar Anda dengan tag:
docker build . -t <image>
Jalankan gambar Anda dan ikat direktori $ (pwd) saat ini di mana app.py menyimpan dan memetakannya ke / root / example / di dalam wadah Anda.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
sumber
Ini juga dapat dilakukan di SDK misalnya python. Jika Anda sudah memiliki wadah yang dibangun Anda dapat mencari nama melalui konsol (
docker ps -a
) nama tampaknya merupakan gabungan dari seorang ilmuwan dan kata sifat (yaitu "relaxed_pasteur").Lihat
help(container.get_archive)
:Jadi sesuatu seperti ini akan keluar dari jalur yang ditentukan (/ output) dalam wadah ke mesin host Anda dan membongkar tar.
sumber