คัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์ Docker


1578

ฉันกำลังพยายามสร้างโซลูชันสำรองและกู้คืนสำหรับคอนเทนเนอร์ Docker ที่เราทำงานด้วย

ฉันมีอิมเมจพื้นฐานที่ฉันสร้างขึ้นubuntu:baseและไม่ต้องการให้สร้างใหม่ทุกครั้งด้วยไฟล์ Docker เพื่อเพิ่มไฟล์ลงไป

ฉันต้องการสร้างสคริปต์ที่ทำงานจากเครื่องโฮสต์และสร้างคอนเทนเนอร์ใหม่โดยใช้ubuntu:baseอิมเมจ Docker แล้วคัดลอกไฟล์ไปยังคอนเทนเนอร์นั้น

ฉันจะคัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์ได้อย่างไร


11
หากคุณไม่ต้องการที่จะสร้างใหม่ทำไมไม่ " นักเทียบท่ากระทำ "? ที่บันทึกภาพของคุณ
Berend de Boer

27
แค่พูดถึงความคิดที่ไม่มีใครพูดถึง: โดยทั่วไปแล้วให้ถือภาชนะเป็น "ชั่วคราว" มีกรณีใช้เพื่อคัดลอกไฟล์ลงใน / จากภาชนะที่กำลังทำงานอยู่ (การทดสอบต้นแบบ) แต่ถ้าคุณพบว่าตัวเองอยู่ในตำแหน่งที่คุณไม่สามารถสร้างสิ่งที่คุณต้องการได้โดยใช้ Dockerfiles และ / หรือเขียนคุณอาจอยู่ในที่ที่ไม่ดี โดยทั่วไปคุณไม่ต้องการสำรองข้อมูลคอนเทนเนอร์ราวกับว่ามันเป็น OS หรือแม้แต่วัตถุ VM โดยทั่วไป :-)
Scott Prive

มีความเป็นไปได้ที่จะคัดลอกไฟล์จาก Docker container ไปยังโฮสต์
Shubham

คำตอบ:


2674

cpคำสั่งสามารถใช้ในการคัดลอกไฟล์

สามารถคัดลอกไฟล์หนึ่งไฟล์ไปยังภาชนะเช่น:

docker cp foo.txt mycontainer:/foo.txt

สามารถคัดลอกไฟล์หนึ่งไฟล์จากภาชนะเช่น:

docker cp mycontainer:/foo.txt foo.txt

สำหรับการเน้นmycontainerเป็นภาชนะที่ประชาชนไม่ภาพ ID

srcสามารถคัดลอกหลายไฟล์ที่มีอยู่ในโฟลเดอร์ไปยังtargetโฟลเดอร์โดยใช้:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

การอ้างอิง: Docker CLI docs สำหรับcp

ใน Docker เวอร์ชั่นก่อน 1.8 เป็นไปได้ที่จะคัดลอกไฟล์จากคอนเทนเนอร์ไปยังโฮสต์เท่านั้น ไม่ใช่จากโฮสต์ไปยังคอนเทนเนอร์


2
โปรดทราบว่าสิ่งนี้สามารถอยู่บนโฮสต์ vm หรือระบบปฏิบัติการหลักและทำงานได้ทั้งโฮสต์กับคอนเทนเนอร์หรือ vm ไปยังโฮสต์ (หรือระบบปฏิบัติการหลัก)
Adam Tuliper - MSFT

7
ใน Dockerfile คุณสามารถใช้คีย์เวิร์ด ADD เพื่อเพิ่มไฟล์ระหว่างเวลาสร้าง
0x7d7b

4
@ h3nrik เป็นCOPYที่ต้องการมากกว่าADDเมื่อมี
Franklin Yu

10
ใช้docker cpเพื่อคัดลอกจากคอนเทนเนอร์ไปยังโฮสต์ทำงานได้ดี แต่เมื่อใช้เพื่อคัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์จะไม่มีผลกระทบ ... ใครรู้ว่าทำไม รุ่นนักเทียบท่า: นักเทียบท่ารุ่น 1.10.3, สร้าง cb079f6 ที่ไม่รองรับ
Ace.Yin

2
ฉันสามารถคัดลอกหลายไฟล์โดยใช้ docker cp จากโฮสต์ไปยังคอนเทนเนอร์ได้หรือไม่
Yogesh

182
  1. รับชื่อคอนเทนเนอร์หรือรหัสย่อคอนเทนเนอร์:

    $ docker ps
    
  2. รับรหัสที่เก็บเต็ม:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. คัดลอกไฟล์:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

ตัวอย่าง:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

หรือ

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

13
สำหรับผมเส้นทางการติดตั้งโฮสต์ไม่ได้มีแต่aufs devicemapperวิธีที่ง่ายที่สุดในการตรวจสอบตู้คอนเทนเนอร์เส้นทางการติดตั้ง (ในขณะที่มีการทำงาน) mountคือการเรียกใช้คำสั่ง
Derenio

3
ฉันลองวิธีแก้ปัญหาข้างต้น มันคัดลอกไฟล์ลงในไดเรกทอรีเฉพาะนักเทียบท่า อย่างไรก็ตามเมื่อฉันใช้ bash สำหรับคอนเทนเนอร์ docker ไฟล์จะไม่ปรากฏขึ้นที่นั่น มีบางอย่างที่ฉันขาดหายไปหรือไม่?
AppleBud

2
เส้นทางใหม่คือ / var / lib / docker / devicemapper / mnt / <<id>> /
rootfs

4
สำหรับฉันบน Docker 1.4.1 (ล่าสุด) มันเป็น/var/lib/docker/aufs/diff/<id>/
user193130

3
แล้วผู้ใช้ MacOS ที่ยากจนล่ะ? ไดเรกทอรีติดตั้งอยู่ใน/var/libสำหรับฉัน find / -name dockerไม่เป็นประโยชน์เช่นกัน
prayagupd

141

วิธีที่สะอาดที่สุดคือติดตั้งไดเรกทอรีโฮสต์บนคอนเทนเนอร์เมื่อเริ่มต้นคอนเทนเนอร์:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

3
คุณจะเรียกใช้คอนเทนเนอร์ได้อย่างไร ฉันคิดว่าคุณสามารถทำได้ด้วยภาพเท่านั้น
Pavel Zaitsev

ฉันไม่สามารถใช้งานได้เมื่อคอนเทนเนอร์มีอยู่แล้วหรือที่รู้จักกันว่าเคยทำงานมาก่อน น้ำมันดินด้านล่างใช้งานได้ดี
Eino Mäkitalo

1
วิธีเดียวที่ใช้งานได้สำหรับฉันคือการแนบโวลุ่มไปพร้อม ๆ กับการเรียกใช้ภาพ จบลงด้วย:docker run -d -p -v /host/path:/mnt --name container_name image_name
peter n

2
มันใช้งานไม่ได้สำหรับฉัน Atleast ไม่สามารถเรียกใช้คอนเทนเนอร์ สามารถทำงานได้เฉพาะภาพเท่านั้น
Shashank Hegde

1
ฉันประหลาดใจที่docker cpเป็นการดำเนินการทางเดียว!
ThorSummoner

115

ต่อไปนี้เป็นวิธีที่น่าเกลียดในการทำ แต่ใช้งานได้

docker run -i ubuntu /bin/bash -c 'cat > file' < file

7
มันใช้งานได้ดี! แต่อย่าลืมยอมรับการเปลี่ยนแปลง: docker commit `docker ps -l -q` ubuntu-with-file. การเปลี่ยนแปลงจะหายไป (ใช้ชื่ออะไรก็ได้ที่คุณต้องการแทนubuntu-with-file)
Michael_Scharf

@Erik: ตำแหน่งของไฟล์เมื่อคอนเทนเนอร์ทำงานอยู่ที่ไหน
coanor

49
ใน ADITION เราสามารถใช้ใหม่docker execคุณสมบัติในการทำงานกับการทำงานภาชนะ:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
Mikl

17
@ Mikl ฉันคิดว่ามันควรจะdocker exec -i ...เป็น-itเพราะไม่มี TTY เมื่อทำการไพพ์จากไฟล์
z0r

4
หากคุณยังคงติดอยู่กับ Docker รุ่นเก่า (อย่างที่ฉันเป็น) และต้องการคัดลอกไดเรกทอรีทั้งหมดคุณสามารถทำสิ่งนี้ได้: tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
eahanson

43

หากคุณต้องการทำสิ่งนี้บนคอนเทนเนอร์ที่รันอยู่คุณสามารถใช้นักเทียบท่า exec (เพิ่มใน 1.3)

ก่อนอื่นค้นหาชื่อหรือ ID ของคอนเทนเนอร์:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

ในตัวอย่างข้างต้นเราสามารถใช้หรือb9b7400ddd8felated_hodgkin

หากคุณต้องการคัดลอกทุกอย่างใน/tmp/somefilesโฮสต์ไป/var/wwwยังคอนเทนเนอร์:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

จากนั้นเราสามารถดำเนินการ/bin/bashในคอนเทนเนอร์และตรวจสอบว่ามันทำงาน:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

ใช้งานได้ดีบนนักเทียบท่า 1.16 บน Centos 7.4 ความคิดสร้างสรรค์ที่ยอดเยี่ยม
Dudi Boy

41
  1. สร้าง dockerfile ใหม่และใช้ภาพที่มีอยู่เป็นฐานของคุณ

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. จากนั้นสร้างคอนเทนเนอร์:

    docker build .
    

2
นี่คือสิ่งที่ได้ผลสำหรับฉัน ไม่มีอะไรอีกแล้ว. ขอบคุณ!
โอเว่

มันจะสร้างภาพใหม่ไม่ใช่ภาชนะใหม่โดยตรง หากคุณใช้รูปภาพนี้ซ้ำในขณะที่ myFile.py เปลี่ยนไปมันจะใช้ไฟล์เวอร์ชั่นที่เก่ากว่าเว้นแต่คุณจะสร้างรูปภาพขึ้นใหม่
Guillaume Lebreton

ฉันพบสิ่งนี้เป็นวิธีที่เร็วที่สุดเฉพาะในกรณีที่คุณทำการทดสอบบนเซิร์ฟเวอร์ระยะไกล
Dominik

ตามนี้คนส่วนใหญ่ควรใช้สำเนาแทนที่จะใส่ แต่สำหรับไฟล์ในเครื่อง (ในตัวอย่างนี้) มันเทียบเท่ากัน
hoosierEE

39

การแก้ปัญหาได้รับด้านล่าง

จากเปลือก Docker

root@123abc:/root#  <-- get the container ID

จากโฮสต์

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

ไฟล์จะถูกคัดลอกไปยังตำแหน่งที่ภาชนะตั้งอยู่บนระบบไฟล์โดยตรง


10
คำตอบที่ดี ใน docker ที่ใหม่กว่าออกพา ธ ที่ได้รับการเปลี่ยนชื่อเป็น / var / lib / docker / aufs / mnt /
Alex Volkov

เส้นทาง devicemapper ดูเหมือนจะไม่ทำงานบน fedora ด้วย docker 1.6 ได้วางไว้เป็น Q แยกstackoverflow.com/questions/29939419/…ความคิดเห็นใด ๆ ที่จะได้รับการชื่นชม
Yogesh_D

33

โดยทั่วไปแล้วจะมีสามประเภท:

  1. จากคอนเทนเนอร์ไปยังโฮสต์

    docker cp container_id:./bar/foo.txt .
    

dev1

  1. จากโฮสต์ไปยังคอนเทนเนอร์

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev2

  1. จากคอนเทนเนอร์ไปยังคอนเทนเนอร์ผสม 1 และ 2

    docker cp container_id1:./bar/foo.txt .
    
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev3


6
cp นักเทียบท่าทำงานได้ทั้งสองวิธี ไม่จำเป็นต้อง exec, cat, และ redirect นักเทียบท่า cp host_file.txt คอนเทนเนอร์: / path /
tbm

32

โซลูชันอื่นสำหรับการคัดลอกไฟล์ลงในคอนเทนเนอร์ที่รันอยู่คือการใช้ tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

คัดลอกไฟล์foo.shลง/tmpในคอนเทนเนอร์

แก้ไข: ลบรายการที่-fต้องขอบคุณขอบคุณสำหรับความคิดเห็นของMaarten


นี่เป็นสิ่งที่ดีถ้าคุณต้องการส่งไดเรกทอรีทั้งหมด สำหรับไฟล์เดียวคำตอบของ Erik นั้นง่ายกว่า
เคลวิน

1
@Kelvin: แต่ tar ยังรักษาคุณสมบัติของไฟล์และชื่อ ในหมู่คนอื่น ๆ ซึ่งหมายความว่าคุณจะต้องพิมพ์ชื่อเพียงครั้งเดียว (และคุณจะได้รับแท็บเสร็จจากเชลล์ของคุณ) ดังนั้นฉันจะบอกว่า tar นั้นง่ายกว่าจริง ๆ ตราบใดที่มันติดตั้งในภาชนะ
Maarten

1
-f -เป็นซ้ำซ้อนบิตแม้ว่าพฤติกรรมเริ่มต้นคือการเขียนไปยัง stdout อยู่แล้ว
Maarten

นี่หมายความว่ามีการพึ่งพาโฮสต์บน tar
cellige

ถูกต้องคุณต้องติดตั้ง tar บนโฮสต์และภายในคอนเทนเนอร์ ทุกวันนี้การใช้ docker cp เป็นทางออกที่ดีกว่า
joemat

24

เพื่อคัดลอกไฟล์จากโฮสต์ไปยังภาชนะที่ใช้

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

อิงจากคำตอบของ Erikและ Mikl's และ z0r


โซลูชันที่ยอมรับบางครั้งรบกวนการเยื้องของไฟล์เมื่อถ่ายโอนไปยังคอนเทนเนอร์ที่กำลังทำงาน ใช้งานได้ดีกับกรณีเช่นนี้
Dreams

15

ด้วย Docker 1.8 ทำให้docker cpสามารถคัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์ ดูโพสต์บล็อกหางประกาศหาง 1.8: เนื้อหาที่เชื่อถือกล่องเครื่องมือและการปรับปรุง Registry และ Orchestration


นี่คือตัวอย่างdocker cp foo.txt mycontainer:/foo.txt
lockwobr

15

นี่คือคำตอบโดยตรงสำหรับคำถาม 'การคัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์นักเทียบท่า' ในคำถามนี้ในหัวข้อ

ลองdocker cpดู มันเป็นวิธีที่ง่ายที่สุดในการทำเช่นนั้นและทำงานได้แม้บน Mac ของฉัน การใช้งาน:

docker cp /root/some-file.txt some-docker-container:/root

นี้จะคัดลอกไฟล์some-file.txtในไดเรกทอรี/rootบนเครื่องโฮสต์ของคุณลงในภาชนะหางชื่อลงในไดเรกทอรีsome-docker-container /rootมันอยู่ใกล้กับไวยากรณ์คัดลอกที่ปลอดภัย และดังที่แสดงในโพสต์ก่อนหน้าคุณสามารถใช้มันในทางกลับกัน นั่นคือคุณคัดลอกไฟล์จากคอนเทนเนอร์ไปยังโฮสต์

และก่อนที่จะโพสต์นี้ downlink docker cp --helpกรุณาใส่ การอ่านเอกสารจะมีประโยชน์มากบางครั้ง ...

หากคุณไม่ชอบวิธีนั้นและคุณต้องการปริมาณข้อมูลในคอนเทนเนอร์ที่สร้างและใช้งานแล้วนันทนาการเป็นทางเลือกเดียวของคุณในวันนี้ ดูเพิ่มเติมฉันจะเพิ่มปริมาณให้กับคอนเทนเนอร์ Docker ที่มีอยู่ได้อย่างไร .


15

ฉันลองใช้โซลูชัน (upvoted) ส่วนใหญ่ที่นี่ แต่ใน docker 17.09 (ในปี 2018) ไม่มีโฟลเดอร์ / var / lib / docker / aufs อีกต่อไป

ง่าย ๆdocker cpนี้แก้ไขงานนี้

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

วิธีรับ container_name

 docker ps 

มีNAMESส่วนคือ IMAGEอย่าใช้


12

ในการคัดลอกไฟล์ / โฟลเดอร์ระหว่างคอนเทนเนอร์และระบบไฟล์โลคัลให้พิมพ์คำสั่ง:

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

ตัวอย่างเช่น,

docker cp /home/foo container-id:/home/dir

ในการรับ contianer id ให้พิมพ์คำสั่งที่กำหนด:

docker ps

เนื้อหาข้างต้นจะนำมาจากdocker.com


8

สมมติว่าคอนเทนเนอร์กำลังทำงานอยู่ให้พิมพ์คำสั่งที่กำหนด:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

ในการแชร์ไฟล์โดยใช้ไดเรกทอรีที่ใช้ร่วมกันให้รันคอนเทนเนอร์ด้วยการพิมพ์คำสั่งที่กำหนด:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

หมายเหตุ: ปัญหาเกี่ยวกับการอนุญาตอาจเกิดขึ้นเนื่องจากผู้ใช้คอนเทนเนอร์ไม่เหมือนกับผู้ใช้ของโฮสต์


1
นอกจากนี้:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
Mikl

2
โปรดทราบว่าcatจะไม่ถูกยกเลิกเมื่อออกจาก หากเป็นเรื่องสำคัญสำหรับคุณ (หากคุณกำลังคัดลอกสคริปต์ทุบตีทุบตีจะปฏิเสธที่จะเรียกใช้) คุณควรเรียกใช้lsof | grep yourfilenameและฆ่าcatกระบวนการที่เก็บไฟล์ดังกล่าว
johndodo

ขอบคุณ! สุดยอดเคล็ดลับ คุณช่วยบอกวิธีฆ่ากระบวนการนี้ด้วยคำสั่งเดียวได้ไหม kill $(lsof | grep /path/to/file | sed ...)สิ่งที่ชอบ ฉันจะขอบคุณสำหรับความช่วยเหลือของคุณ
Mikl

kill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Mikl

8

นี่คือคำสั่งให้คัดลอกข้อมูลจาก Docker ไปยัง Host:

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

ด้านล่างเป็นคำสั่งเพื่อคัดลอกข้อมูลจากโฮสต์ไปยังนักเทียบท่า:

docker cp a.txt ccfbeb35116b:/home/

7

ในสภาพแวดล้อมของนักเทียบท่าพบคอนเทนเนอร์ทั้งหมดในไดเรกทอรี:

/var/lib/docker/aufs/required-docker-id/

หากต้องการคัดลอกไดเร็กทอรี / ไฟล์ต้นฉบับไปยังส่วนใด ๆ ของคอนเทนเนอร์ให้พิมพ์คำสั่งที่กำหนด:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/


5

tarและdocker cpเป็นคำสั่งผสมที่ดีสำหรับการคัดลอกทุกสิ่งในไดเรกทอรี

สร้างที่เก็บข้อมูลปริมาณ

docker create --name dvc --volume /path/on/container cirros

เพื่อรักษาลำดับชั้นไดเรกทอรี

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

ตรวจสอบงานของคุณ

docker run --rm --volumes-from dvc cirros ls -al /path/on/container

5

หากโฮสต์คือ CentOS หรือ Fedora แสดงว่าไม่มีพร็อกซีใน/var/lib/docker/aufsแต่อยู่ภายใต้/proc:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

cmd นี้จะคัดลอกเนื้อหาทั้งหมดของdataไดเรกทอรีไปยัง/คอนเทนเนอร์ด้วย id "containerid"


สิ่งนี้ไม่ได้เป็นเอกลักษณ์เฉพาะของ Redhat: มันยังใช้งานได้กับ Debian (อาจเป็น Gnu / Linux ทั้งหมดด้วย/proc) ขยายเส้นทางเพื่อนำไฟล์ไปไว้ที่อื่นไม่ใช่เฉพาะรูท
ctrl-alt-delor

5

ในกรณีที่มันไม่ชัดเจนสำหรับคนอย่างฉันmycontainerในสิ่งที่@ h3nrik คำตอบหมายความว่ามันเป็นรหัสภาชนะจริง ในการคัดลอกไฟล์WarpSquare.mp4ใน/app/example_scenes/1440p60จากภาชนะนักเทียบท่าออกไปยังโฟลเดอร์ปัจจุบันผมใช้นี้

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

โดยdocker ps -q -lดึง ID คอนเทนเนอร์ของอินสแตนซ์ที่ออกล่าสุด ในกรณีที่ไม่ได้เป็นคอนเทนเนอร์ที่ออกคุณสามารถรับโดยdocker container lsหรือdocker ps


1
คุณสามารถแสดงรายการรหัสของภาชนะบรรจุออกด้วยหรือdocker ps -a docker container ls -a
0x7d7b

4

หลายคนที่พบคำถามนี้อาจมีปัญหาในการคัดลอกไฟล์ไปยังอิมเมจ Docker ในขณะที่มันกำลังถูกสร้างขึ้น (ฉันทำ)

ในกรณีนั้นคุณสามารถใช้COPYคำสั่งในการDockerfileที่คุณใช้ในการสร้างภาพ

โปรดดูเอกสาร


4

คุณสามารถติดตามที่อยู่ IP ของเครื่องท้องถิ่นของคุณโดยใช้

ifconfig

จากนั้นเพียงแค่ป้อนลงในภาชนะ Docker ของคุณและพิมพ์

scp user_name@ip_address:/path_to_the_file destination

ไม่ว่าในกรณีใด ๆ หากคุณไม่ได้ติดตั้งไคลเอนต์และเซิร์ฟเวอร์ SSH ให้ติดตั้งโดยใช้:

sudo apt-get install openssh-server

ขอบคุณมากมันใช้ได้ดีสำหรับฉัน นอกจากนี้ฉันพบว่ามันมีประสิทธิภาพมากกว่าวิธีอื่น ๆ
user1314742

นี่เป็นทางออกที่น่ากลัวในเรื่องความปลอดภัย

4

นี่คือระบบออนไลน์สำหรับการคัดลอกไฟล์เดียวในขณะที่ใช้งานภาชนะบรรจุ Tomcat

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

สิ่งนี้จะคัดลอกไฟล์สงครามไปยังไดเรกทอรี webapps และทำให้แอปของคุณทำงานได้ในเวลาไม่นาน


1
-v จะเมานต์ (เช่นสร้างลิงก์) ไม่ใช่คัดลอก
Vitaliy Ulantikov

ความแตกต่างในผลที่ได้ก็คือการติดตั้งซ่อนเนื้อหาภาชนะก่อนหน้านี้เช่นถ้าคุณติดโฟลเดอร์โฮสต์บนบรรจุภัณฑ์โฟลเดอร์ที่คุณมองไม่เห็นอีกต่อไปเนื้อหาโฟลเดอร์ภาชนะก่อนหน้า
mrq

4

คอนเทนเนอร์อัพไวยากรณ์:

 docker run -v /HOST/folder:/Container/floder 

ในไฟล์นักเทียบท่า

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"

3

วิธีที่ดีที่สุดสำหรับการคัดลอกไฟล์ไปยังคอนเทนเนอร์ที่ฉันพบคือการติดตั้งไดเรกทอรีบนโฮสต์โดยใช้-vตัวเลือกคำสั่งนักวิ่ง


3

มีคำตอบที่ดี แต่เฉพาะเจาะจงเกินไป ฉันรู้ว่าdocker psเป็นวิธีที่ดีในการรับรหัสคอนเทนเนอร์ที่คุณสนใจจากนั้นทำ

mount | grep <id>

เพื่อดูว่าวอลลุ่มนั้นติดตั้งอยู่ที่ใด ที่

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

สำหรับฉัน แต่มันอาจเป็นเส้นทางที่แตกต่างกันขึ้นอยู่กับระบบปฏิบัติการและการกำหนดค่า ตอนนี้เพียงแค่คัดลอกไฟล์ไปยังเส้นทางนั้น

การใช้งาน-vอาจไม่ได้ผลเสมอไป


3

ฉันเพิ่งเริ่มใช้นักเทียบท่าเพื่อรวบรวม VLC นี่คือสิ่งที่คุณสามารถทำได้เพื่อคัดลอกไฟล์ไปมาจากคอนเทนเนอร์:

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

ค้นหาไฟล์ที่คุ้นเคยใน txt นั้นและคุณจะมีโฟลเดอร์ cd ไปเป็น root และ voila! คัดลอกทุกสิ่งที่คุณต้องการ

อาจมีเส้นทางที่มี "ผสาน" อยู่ฉันคิดว่าคุณต้องการเส้นทางที่มี "diff" อยู่ในนั้น

นอกจากนี้หากคุณออกจากคอนเทนเนอร์และต้องการกลับไปยังจุดที่คุณค้างไว้:

docker ps -a
docker start -i containerid

ฉันเดาว่ามีประโยชน์เมื่อคุณไม่ได้ตั้งชื่ออะไรด้วยคำสั่งเช่น

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

แน่นอนว่าวิธีการแฮ็กเกอร์ แต่สิ่งที่!


3
docker cp SRC_PATH CONTAINER_ID:DEST_PATH

ตัวอย่างเช่นฉันต้องการคัดลอกไฟล์ของฉัน xxxx / download / jenkins ไปที่ tomcat

ฉันเริ่มรับรหัสของคอนเทนเนอร์ Tomcat

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/

2

วิธีที่ฉันชอบ:

ภาชนะ:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

file.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

หรือ

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt

เส้นทาง devicemapper ดูเหมือนจะไม่ทำงานบน fedora ด้วย docker 1.6 ได้วางไว้เป็น Q แยกstackoverflow.com/questions/29939419/…ความคิดเห็นใด ๆ ที่จะได้รับการชื่นชม
Yogesh_D

2

ในความคิดของฉันคุณไม่ต้องคัดลอกไฟล์ภายในภาพ แต่คุณสามารถใช้ GIT หรือ SVN สำหรับไฟล์ของคุณแล้วตั้งค่าระดับเสียงที่ซิงโครไนซ์กับโฟลเดอร์ในเครื่อง ใช้สคริปต์ในขณะที่เรียกใช้คอนเทนเนอร์ที่สามารถตรวจสอบว่ามีข้อมูลอยู่แล้วในโฟลเดอร์ท้องถิ่นหากไม่คัดลอกมาจากที่เก็บ GIT ทำให้ภาพของคุณมีน้ำหนักเบามาก


ดูเหมือนว่ามีความเสี่ยงด้านความปลอดภัยและการเข้าถึงฝันร้ายที่เกิดขึ้น คุณให้การเข้าถึงที่เก็บ git จากภายในภาพของคุณได้อย่างไร แม้จะสมมติว่าเป็นที่เก็บข้อมูลสาธารณะที่คุณจะสมมติว่าโฮสต์ที่คอนเทนเนอร์ของคุณทำงานนั้นมีสิทธิ์เข้าถึง repo นั้น
tbm

ฉันเห็นด้วยกับคุณหากมีการใช้คอมไพล์ภายในคอนเทนเนอร์นักเทียบท่า แต่ในกรณีของเราสคริปต์ทำงานจากเครื่องโฮสต์
h.aittamaa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.