Pertanyaan Menyalin file dari penampung Docker ke host


Saya berpikir untuk menggunakan Docker untuk membangun ketergantungan saya pada server integrasi berkesinambungan (CI), sehingga saya tidak perlu menginstal semua runtime dan pustaka pada agen itu sendiri. Untuk mencapai ini, saya perlu menyalin artefak build yang dibangun di dalam wadah kembali ke host.

Apakah itu mungkin?


833
2018-02-26 17:46


asal


Jawaban:


Untuk menyalin file dari sebuah wadah ke host, Anda dapat menggunakan perintah

docker cp <containerId>:/file/path/within/container /host/path/target

Inilah contohnya:

[jalal@goku scratch]$ sudo docker cp goofy_roentgen:/out_read.jpg .

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

[jalal@goku scratch]$ sudo docker ps
[sudo] password for jalal:
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

1557
2018-02-26 18:31



Pasang "volume" dan salin 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 build selesai dan kontainer tidak lagi berjalan, ia sudah menyalin artefak dari build ke dalam artifacts direktori pada host.

EDIT:

CAVEAT: Ketika Anda melakukan ini, Anda mungkin mengalami masalah dengan id pengguna pengguna docker yang cocok dengan id pengguna pengguna yang sedang berjalan. Artinya, file-file dalam /artifacts akan ditampilkan sebagai milik pengguna dengan UID pengguna yang digunakan di dalam wadah buruh pelabuhan. Cara sekitar ini mungkin menggunakan UID pengguna panggilan:

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

53
2017-10-01 20:58



Pasang volume, salin artefak, sesuaikan ID pemilik dan ID grup:

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

16
2018-03-30 15:28



tldr;

$ 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

Lagi ...

docker run dengan volume tuan rumah, chown artefak, cp artefak ke volume tuan rumah:

$ 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 berfungsi karena chown doa di dalam heredoc yang dibutuhkan $(id -u):$(id -g) nilai dari luar wadah yang sedang berjalan; yaitu, host buruh pelabuhan.

Manfaat lebih docker cp adalah:

  • Anda tidak perlu melakukannya docker run --name wadah Anda sebelumnya
  • Anda tidak perlu melakukannya docker container rm setelah

11
2018-05-07 15:54



Saya memposting ini untuk siapa saja yang menggunakan Docker untuk Mac. Inilah yang berhasil 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 bahwa backup direktori secara otomatis dibuat.

Saya harap ini berguna untuk seseorang suatu hari nanti. :)


6
2018-01-17 08:10



Jika Anda tidak memiliki wadah berjalan, hanya gambar, dan dengan asumsi Anda ingin menyalin hanya file teks, Anda dapat melakukan sesuatu seperti ini:

docker run the-image cat path/to/container/file.txt > path/to/host/file.txt

6
2017-11-09 23:06



Sebagai solusi yang lebih umum, ada plugin CloudBees untuk Jenkins untuk membangun di dalam wadah Docker. Anda dapat memilih gambar untuk digunakan dari registri Docker atau menentukan Dockerfile untuk dibuat dan digunakan.

Ini akan me-mount ruang kerja ke dalam wadah sebagai volume (dengan pengguna yang sesuai), atur sebagai direktori kerja Anda, lakukan perintah apa pun yang Anda minta (di dalam wadah). Anda juga dapat menggunakan plugin docker-workflow (jika Anda lebih suka kode di atas UI) untuk melakukan ini, dengan perintah image.inside () {}.

Pada dasarnya semua ini, dipanggang ke server CI / CD Anda dan beberapa kemudian.


3
2017-09-13 04:39