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?
Dalam rangka untuk menyalin file dari satu wadah ke host, anda dapat menggunakan perintah
docker cp <containerId>:/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 .
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.
Mount "volume" dan copy artefak ke sana:
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS
Kemudian ketika selesai membangun dan wadah tidak lagi berjalan, itu sudah disalin artefak dari membangun ke artefak
direktori pada host.
Peringatan: Ketika anda melakukan ini, anda mungkin mengalami masalah dengan user id docker user sesuai dengan user id yang berjalan saat ini pengguna. Artinya, file dalam /artefak
akan ditampilkan seperti yang dimiliki oleh user dengan UID pengguna digunakan di dalam kontainer docker. Cara ini dapat digunakan pengguna panggilan's UID:
docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS
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 << COMMANDS
ls -la > /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
$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown $(id -u):$(id -g) my-artifact.tar.xz
cp -a my-artifact.tar.xz /host-volume
EOF
docker run
dengan sejumlah volume, chown
artefak, cp
artefak untuk host volume:
$ docker build -t my-image - <<EOF
> FROM busybox
> WORKDIR /workdir
> RUN touch foo.txt bar.txt qux.txt
> EOF
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM busybox
---> 00f017a8c2a6
Step 2/3 : WORKDIR /workdir
---> Using cache
---> 36151d97f2c9
Step 3/3 : RUN touch foo.txt bar.txt qux.txt
---> Running in a657ed4f5cab
---> 4dd197569e44
Removing intermediate container a657ed4f5cab
Successfully built 4dd197569e44
$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown -v $(id -u):$(id -g) *.txt
cp -va *.txt /host-volume
EOF
changed ownership of '/host-volume/bar.txt' to 10335:11111
changed ownership of '/host-volume/qux.txt' to 10335:11111
changed ownership of '/host-volume/foo.txt' to 10335:11111
'bar.txt' -> '/host-volume/bar.txt'
'foo.txt' -> '/host-volume/foo.txt'
'qux.txt' -> '/host-volume/qux.txt'
$ ls -n
total 0
-rw-r--r-- 1 10335 11111 0 May 7 18:22 bar.txt
-rw-r--r-- 1 10335 11111 0 May 7 18:22 foo.txt
-rw-r--r-- 1 10335 11111 0 May 7 18:22 qux.txt
Trik ini bekerja karena chown
doa dalam heredoc mengambil $(id -u):$(id -g)
nilai-nilai dari luar yang menjalankan kontainer; yaitu, docker tuan rumah.
Manfaat:
docker container run --nama
atau docker container create --nama
sebelumdocker container rm
setelahJika 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
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
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 <containerid> \
-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. :)
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.
docker run -dit --rm IMAGE
docker cp CONTAINER:SRC_PATH DEST_PATH
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.
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
Membuat jalan di mana anda ingin menyalin file dan kemudian menggunakan:
docker run -d -v hostpath:dockerimag
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
Anda dapat menggunakan mengikat
bukan volume
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