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?

Mengomentari pertanyaan (1)
Larutan

Dalam rangka untuk menyalin file dari satu wadah ke host, anda dapat menggunakan perintah

docker cp :/file/path/within/container /host/path/target

Berikut ini's contoh:

$ sudo docker cp goofy_roentgen:/out_read.jpg .

Di sini goofy_roentgen adalah wadah nama saya dapatkan dari perintah berikut:

$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen

Anda juga dapat menggunakan (bagian dari) Container ID. Perintah berikut adalah setara dengan yang pertama

$ sudo docker cp 1b4a:/out_read.jpg .
Komentar (19)

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

docker create -ti --name dummy IMAGE_NAME bash
docker cp dummy:/path/to/file /dest/to/file
docker rm -f dummy

Di sini, anda tidak pernah memulai wadah. Yang tampak bermanfaat untuk saya.

Komentar (6)

Mount "volume" dan copy artefak ke sana:


mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh 
Komentar (6)

Me-Mount volume, copy artefak, menyesuaikan pemilik id dan group id:

mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash  /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /mnt/artifacts
COMMANDS
Komentar (0)

TLDR;


$ docker run --rm -iv${PWD}:/host-volume my-image sh -s 
Komentar (1)

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:

docker run the-image cat path/to/container/file.txt > path/to/host/file.txt
Komentar (0)

Sebagian besar jawaban tidak menunjukkan bahwa wadah harus dijalankan sebelum docker cp akan bekerja:

docker build -t IMAGE_TAG .
docker run -d IMAGE_TAG
CONTAINER_ID=$(docker ps -alq)
# If you do not know the exact file name, you'll need to run "ls"
# FILE=$(docker exec CONTAINER_ID sh -c "ls /path/*.zip")
docker cp $CONTAINER_ID:/path/to/file .
docker stop $CONTAINER_ID
Komentar (1)

Saya posting ini untuk siapa saja yang menggunakan Docker untuk Mac. Ini adalah apa yang bekerja untuk saya:

 $ mkdir mybackup # local directory on Mac

 $ docker run --rm --volumes-from  \
    -v `pwd`/mybackup:/backup \  
    busybox \                   
    cp /data/mydata.txt /backup 

Perhatikan bahwa ketika saya me-mount menggunakan -v yang cadangan direktori yang secara otomatis dibuat.

Saya berharap hal ini berguna untuk seseorang suatu hari nanti. :)

Komentar (2)

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.

Komentar (0)
Komentar (0)

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.

Komentar (0)

Saya menggunakan PowerShell (Admin) dengan perintah ini.

docker cp {container id}:{container path}/error.html  C:\\error.html

Contoh

docker cp ff3a6608467d:/var/www/app/error.html  C:\\error.html
Komentar (0)

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:

$ ls
Dockerfile  go.mod  main.go

$ cat Dockerfile
FROM golang:1.12-alpine as dev
RUN apk add --no-cache git ca-certificates
RUN adduser -D appuser
WORKDIR /src
COPY . /src/
CMD CGO_ENABLED=0 go build -o app . && ./app

FROM dev as build
RUN CGO_ENABLED=0 go build -o app .
USER appuser
CMD [ "./app" ]

FROM scratch as release
COPY --from=build /etc/passwd /etc/group /etc/
COPY --from=build /src/app /app
USER appuser
CMD [ "/app" ]

FROM scratch as artifact
COPY --from=build /src/app /app

FROM release

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:

$ DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
[+] Building 43.5s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                                                              0.7s
 => => transferring dockerfile: 572B                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                 0.5s
 => => transferring context: 2B                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/golang:1.12-alpine                                                             0.9s
 => [dev 1/5] FROM docker.io/library/golang:1.12-alpine@sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0  22.5s
 => => resolve docker.io/library/golang:1.12-alpine@sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0       0.0s
 => => sha256:1ec62c064901392a6722bb47a377c01a381f4482b1ce094b6d28682b6b6279fd 155B / 155B                                        0.3s
 => => sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0 1.65kB / 1.65kB                                    0.0s
 => => sha256:2ecd820bec717ec5a8cdc2a1ae04887ed9b46c996f515abc481cac43a12628da 1.36kB / 1.36kB                                    0.0s
 => => sha256:6a17089e5a3afc489e5b6c118cd46eda66b2d5361f309d8d4b0dcac268a47b13 3.81kB / 3.81kB                                    0.0s
 => => sha256:89d9c30c1d48bac627e5c6cb0d1ed1eec28e7dbdfbcc04712e4c79c0f83faf17 2.79MB / 2.79MB                                    0.6s
 => => sha256:8ef94372a977c02d425f12c8cbda5416e372b7a869a6c2b20342c589dba3eae5 301.72kB / 301.72kB                                0.4s
 => => sha256:025f14a3d97f92c07a07446e7ea8933b86068d00da9e252cf3277e9347b6fe69 125.33MB / 125.33MB                               13.7s
 => => sha256:7047deb9704134ff71c99791be3f6474bb45bc3971dde9257ef9186d7cb156db 125B / 125B                                        0.8s
 => => extracting sha256:89d9c30c1d48bac627e5c6cb0d1ed1eec28e7dbdfbcc04712e4c79c0f83faf17                                         0.2s
 => => extracting sha256:8ef94372a977c02d425f12c8cbda5416e372b7a869a6c2b20342c589dba3eae5                                         0.1s
 => => extracting sha256:1ec62c064901392a6722bb47a377c01a381f4482b1ce094b6d28682b6b6279fd                                         0.0s
 => => extracting sha256:025f14a3d97f92c07a07446e7ea8933b86068d00da9e252cf3277e9347b6fe69                                         5.2s
 => => extracting sha256:7047deb9704134ff71c99791be3f6474bb45bc3971dde9257ef9186d7cb156db                                         0.0s
 => [internal] load build context                                                                                                 0.3s
 => => transferring context: 2.11kB                                                                                               0.0s
 => [dev 2/5] RUN apk add --no-cache git ca-certificates                                                                          3.8s
 => [dev 3/5] RUN adduser -D appuser                                                                                              1.7s
 => [dev 4/5] WORKDIR /src                                                                                                        0.5s
 => [dev 5/5] COPY . /src/                                                                                                        0.4s
 => [build 1/1] RUN CGO_ENABLED=0 go build -o app .                                                                              11.6s
 => [artifact 1/1] COPY --from=build /src/app /app                                                                                0.5s
 => exporting to client                                                                                                           0.1s
 => => copying files 10.00MB                                                                                                      0.1s

Setelah membangun menyelesaikan aplikasi biner diekspor:

$ ls
Dockerfile  app  go.mod  main.go

$ ./app
Ready to receive requests on port 8080

Docker memiliki pilihan lain untuk --output bendera didokumentasikan di hulu BuildKit repo: https://github.com/moby/buildkit#output

Komentar (0)

Membuat jalan di mana anda ingin menyalin file dan kemudian menggunakan:

docker run -d -v hostpath:dockerimag
Komentar (0)

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

docker run -d -v /path/to/Local_host_dir:/path/to/docker_dir docker_image:tag
Komentar (2)

Anda dapat menggunakan mengikat bukan volume jika anda ingin me-mount hanya satu folder, tidak membuat penyimpanan khusus untuk wadah:

  1. Membangun citra anda dengan tag <gambar>:

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

Komentar (0)