วิธีเมาท์ไดเร็กทอรีโฮสต์ในคอนเทนเนอร์ Docker


618

ฉันกำลังพยายามติดตั้งไดเรกทอรีโฮสต์ลงในคอนเทนเนอร์ Docker เพื่อให้การอัปเดตใด ๆ ที่ทำในโฮสต์นั้นสะท้อนไปยังคอนเทนเนอร์ Docker

ฉันทำอะไรผิดไป นี่คือสิ่งที่ฉันทำ:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • ฉันไม่รู้วิธีตรวจสอบเวอร์ชั่น boot2docker

คำถามปัญหาที่พบ:

  1. ฉันจะต้องเชื่อมโยง main_folder กับโฟลเดอร์ test_container ที่มีอยู่ในคอนเทนเนอร์ docker ได้อย่างไร
  2. ฉันต้องทำสิ่งนี้โดยอัตโนมัติ ฉันจะทำสิ่งนั้นโดยไม่ใช้run -d -vคำสั่งจริงๆได้อย่างไร
  3. จะเกิดอะไรขึ้นหาก boot2docker ขัดข้อง ไฟล์ Docker จัดเก็บอยู่ที่ไหน (นอกเหนือจาก Dockerfile)

2
ปีงบประมาณนี้ดูเหมือนว่าจะได้รับการแก้ไขในนักเทียบท่าตามความคิดเห็นนี้ ฉันใช้ boot2docker บน mac ของฉัน ฉันสามารถใช้ตัวเลือก -v และไดเรกทอรีท้องถิ่นของฉันได้รับการติดตั้งลงในภาชนะ
Marco

คำตอบ:


508

มีสองวิธีที่คุณสามารถทำได้ วิธีที่ง่ายที่สุดในการทำเช่นนั้นคือใช้ADDคำสั่งdockerfile ดังนี้:

ADD . /path/inside/docker/container

อย่างไรก็ตามการเปลี่ยนแปลงใด ๆ ที่ทำกับไดเร็กทอรีนี้บนโฮสต์หลังจากสร้าง dockerfile จะไม่ปรากฏในคอนเทนเนอร์ นี่คือเนื่องจากเมื่อสร้างคอนเทนเนอร์นักเทียบท่าบีบอัดไดเรกทอรีลงใน.tarและอัปโหลดบริบทนั้นลงในคอนเทนเนอร์อย่างถาวร

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

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

ฉันพยายามเช่นนี้ $ นักเทียบท่า kishore -v / ผู้ใช้ / kishore / main_folder: / test_container นักเทียบท่ารุ่น 0.9.1, สร้าง 867b2a9 kishore $ นักเทียบท่าวิ่ง -v / ผู้ใช้ / kishore / main_folder: / test_container การใช้งาน: นักวิ่ง [ตัวเลือก] IMAGE [ คำสั่ง] [ARG ... ] เรียกใช้คำสั่งในคอนเทนเนอร์ใหม่ -P, --publish-all = false: เผยแพร่พอร์ตที่เปิดเผยทั้งหมดไปยังโฮสต์อินเตอร์เฟส -a, --attach = []: แนบกับ stdin, stdout หรือ stderr -c, --cpu-Shares = 0: การแชร์ CPU (น้ำหนักสัมพัทธ์)
Kishore Vaishnav

2
คุณสามารถเพิ่มทั้งสองได้ไหม และโวลต์เมานต์โวลุ่มในเวลาเดียวกัน ใช้ app_dir เริ่มต้นหากไม่ได้ระบุการเมาท์โฮสต์หรือไม่
alexzg

@alexzg ฉันไม่คิดว่าเราจะมีเพียงคนแรกที่จะมาก่อน นอกจากนี้ฉันไม่ชัดเจนเกี่ยวกับจุดเริ่มต้นที่ 2 ของคุณ app_dir ... host mount .. ?
Kishore Vaishnav

35
สิ่งนี้ใช้ได้กับฉันใน mac os x พร้อม docker-machine และ VirtualBox ข้อแม้หนึ่งที่ฉันค้นพบโดยการลองผิดลองถูกคือไดเรกทอรีโฮสต์ต้องเป็นเส้นทางแบบเต็มไม่ใช่เส้นทางสัมพัทธ์
jbustamovej

25
ADDอันที่จริงแล้วไม่ใช่ "การเมาท์" มันจะคัดลอกไฟล์ไปยังคอนเทนเนอร์ที่เก็บไว้ข้างใน
kev

200

ผู้ใช้ของคำถามนี้ใช้Docker version 0.9.1, build 867b2a9ฉันจะให้คำตอบสำหรับนักเทียบท่ารุ่น> = 17.06

bindสิ่งที่คุณต้องการให้ไดเรกทอรีท้องถิ่นตรงกันในสารบบภาชนะสามารถทำได้โดยการติดตั้งไดรฟ์ที่มีประเภท สิ่งนี้จะโยงไดเร็กทอรี (ระบบของคุณ) และไดเร็กทอรีเป้าหมาย (ที่คอนเทนเนอร์นักเทียบท่า) มันเกือบจะเหมือนกับการติดตั้งไดเรกทอรีบน linux

ตามเอกสารหางคำสั่งที่เหมาะสมกับภูเขาอยู่ในขณะนี้แทนmount -vนี่คือเอกสารประกอบ

  • --mount: ประกอบด้วยคู่ของคีย์ - ค่าหลายคู่คั่นด้วยเครื่องหมายจุลภาค คู่คีย์ / ค่าแต่ละคู่ใช้รูปแบบของ<key>=<value>tuple --mountไวยากรณ์มากขึ้น verbose กว่า-vหรือ--volumeแต่คำสั่งของปุ่มไม่ได้เป็นอย่างมีนัยสำคัญและความคุ้มค่าของธงจะง่ายต่อการเข้าใจ

  • typeของภูเขาซึ่งสามารถbind, หรือvolume (เราจะใช้การผูก )tmpfs

  • sourceภูเขา สำหรับการเชื่อมต่อ bind นี่เป็นพา ธ ไปยังไฟล์หรือไดเร็กทอรีบนโฮสต์ Docker daemon อาจจะระบุเป็นหรือsourcesrc

  • destinationจะเป็นความคุ้มค่าเส้นทางที่แฟ้มหรือไดเรกทอรีจะได้รับการติดตั้งในภาชนะ อาจจะระบุเป็นdestination, หรือdsttarget

ดังนั้นเพื่อติดตั้งไดเรกทอรีปัจจุบัน (แหล่งที่มา) กับ/test_container(เป้าหมาย) เราจะใช้:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

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

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

นอกจากนี้คุณยังจะต้องจัดการกับสิทธิ์ในแฟ้มดูบทความนี้


2
ฉันอัป
เกรด

2
ฉันเดาว่าเอกสารได้รับการปรับปรุงตั้งแต่คำตอบนี้เหมือนตอนนี้ดูเหมือนจะแนะนำปริมาณมากกว่าที่จะเมานต์ คุ้มค่าที่จะไปแม้ว่ามันก่อนที่จะกระทำอะไร
Sipty

1
@Sipty อาจหมายถึงสิ่งต่อไปนี้: " หากคุณกำลังพัฒนาแอพพลิเคชั่น Docker ใหม่ให้พิจารณาใช้ชื่อแทนคุณไม่สามารถใช้คำสั่ง Docker CLI เพื่อจัดการ bind mounts ได้โดยตรง "
Aluthren

81

2 การติดต่อเนื่อง: ฉันเดาว่ามีหลายโพสต์ที่นี่อาจใช้สอง boot2docker เหตุผลที่คุณไม่เห็นอะไรเลยก็คือคุณกำลังติดตั้งไดเรกทอรีจาก boot2docker ไม่ใช่จากโฮสต์ของคุณ

โดยทั่วไปคุณต้องการการเมาท์แบบต่อเนื่อง 2 ครั้ง:

คนแรกที่จะเมานท์ไดเรกทอรีจากโฮสต์ของคุณกับระบบของคุณ

ที่สองเพื่อติดตั้งไดเรกทอรีใหม่จาก boot2docker ไปยังคอนเทนเนอร์ของคุณเช่นนี้:

  • 1) ติดตั้งระบบโลคัลบน boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) เมานต์boot2dockerไฟล์บนคอนเทนเนอร์ลินุกซ์

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

จากนั้นเมื่อคุณ lsภายในคุณจะเห็นเนื้อหาของคุณcontainerfolderhostfolder


1
คำตอบที่ดีที่สุด ฉันต้องเพิ่มhostfolder (ภายใต้ windows) ในคำสั่งmountอ้างถึงชื่อแชร์โฟลเดอร์ อันที่ปรากฏขึ้นพร้อมกับnet shareคำสั่งภายใน windows terminal (cmd) และคุณต้องเพิ่มมันเข้าไปในโฟลเดอร์แชร์กับ virtualBox GUI (ใช้ชื่อเดียวกันถ้าคุณทำตามตรรกะของฉัน) หากคุณไม่แชร์มันจะใช้งานได้ แต่คุณจะประสบปัญหาเรื่องสิทธิ์และการรีเฟรช
Kir Kanos

คำสั่ง mount รู้จักโฮสต์ที่ / boot2dockerfolder ได้อย่างไร?
alfonsodev

ฉันได้รับข้อผิดพลาด: mount: unknown filesystem type 'vboxsf'โดยใช้แขกและโฮสต์อูบุนตู
nnyby

"vboxsf" เป็นไดรเวอร์ "ระบบไฟล์" ของระบบไฟล์ VirtualBox จะต้องกำหนดค่าใน VM โดยการติดตั้งส่วนขยาย VirtualBox อิมเมจ boot2docker ต้องไม่มีการติดตั้งเหล่านี้ VirtualBox มีฟังก์ชั่น "อุปกรณ์" เพื่อ "แทรก" ภาพ ISO VirtualBox เพิ่มเป็นปริมาณเสมือน โดยทั่วไปคุณสามารถเมานต์นี้บนเมานต์โดยใช้ mount / dev / cdrom / mnt ไปที่ / mnt และรัน bash VBoxLinuxAdditions อาจต้องติดตั้ง gcc เคอร์เนลหรือการพึ่งพาอื่น ๆ
Andrew Wolfe

mount.vboxsf: ยึดล้มเหลวด้วยข้อผิดพลาด: ไม่มีแฟ้มหรือไดเรกทอรีดังกล่าวติด: mymapfoldername ติดตั้งบน / boot2dockerfolder ล้มเหลว: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
วี

71

คุณสามารถใช้ตัวเลือก -v จาก cli สิ่งอำนวยความสะดวกนี้ไม่สามารถใช้ได้ผ่าน Dockerfile

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

โดยที่ host_dir เป็นไดเรกทอรีจากโฮสต์ที่คุณต้องการเมานท์ คุณไม่จำเป็นต้องกังวลเกี่ยวกับไดเรกทอรีของคอนเทนเนอร์หากไม่มีนักเทียบท่าจะสร้างมันขึ้นมา

หากคุณทำการเปลี่ยนแปลงใด ๆ ใน host_dir จากเครื่องโฮสต์ (ภายใต้สิทธิ์ของรูท) จะสามารถมองเห็นคอนเทนเนอร์และในทางกลับกัน


6
ช่างเป็นตัวอย่างที่ดีสะอาดชี้ไปที่ใดเพื่อแสดงตัวเลือกการเมาท์โฮสต์ มันอาจจะได้รับการปรับปรุงโดยใช้ไดเรกทอรีจริง: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashที่เจ้าภาพจะได้รับการติดตั้งอยู่บนภาชนะ/tmp /tmpตอนนี้หนึ่งสามารถtouch /tmp/hello-worldจากภาชนะและดูไฟล์ที่ปรากฏบนโฮสต์
Stephan Henningsen

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

33

เป็นไปได้ไหมที่คุณจะใช้ Docker บน OS X ผ่าน boot2dockerหรือสิ่งที่คล้ายกัน

ฉันได้ทำประสบการณ์เดียวกัน - คำสั่งถูกต้อง แต่ไม่มีอะไร (เหมาะสม) ติดตั้งในภาชนะแล้ว

มันจะเปิดออก - มันอธิบายแล้วในเอกสารนักเทียบท่า เมื่อคุณพิมพ์docker run -v /var/logs/on/host:/var/logs/in/container ...แล้ว/var/logs/on/hostแมปจริงจากboot2docker VM-image ไม่ใช่ Mac ของคุณ

คุณจะต้องไพพ์โฟลเดอร์ที่แชร์ผ่าน VM ของคุณไปยังโฮสต์จริงของคุณ (Mac ในกรณีของฉัน)


1
ขอบคุณ! สิ่งนี้ช่วยฉันด้วยปัญหาที่เกี่ยวข้องอย่างห่างไกล Postgres ทำงานภายในเทียบท่าได้ผูกไว้กับ VBox IP ไม่ localhost ขณะที่มันจะมีถ้าไม่ได้ทำงานบน OS X ได้
ปีเตอร์ Becich

2
URL นั้นไปยังเอกสารของนักเทียบท่าไม่สามารถใช้งานได้อีกต่อไป
digitaldavenyc

ฮ่าฮ่าเป็นเรื่องตลกที่ดีที่สุดเท่าที่เคยมีมา ..
2834172

2
ลิงก์เอกสารของคุณคือ 404
Factor Mystic

3
ฉันอยากรู้ว่าตัวอย่างของการ piping โฟลเดอร์แชร์ผ่าน VM ไปยังโฮสต์จริง
ดีเร็ก

28

[อัพเดท]ตั้งแต่วันที่ ~ มิถุนายน 2017 Docker for Macจะดูแลทุกส่วนที่น่ารำคาญของที่ซึ่งคุณต้องยุ่งกับ VirtualBox มันช่วยให้คุณแมปทุกอย่างบนโฮสต์ในพื้นที่ของคุณโดยใช้/privateคำนำหน้า ข้อมูลเพิ่มเติมที่นี่ [/ UPDATE]

คำตอบปัจจุบันทั้งหมดพูดคุยเกี่ยวกับ Boot2docker เนื่องจากตอนนี้เลิกใช้แล้วเพื่อประโยชน์ของนักเทียบท่าเครื่องจักรจึงใช้ได้กับเครื่องเทียบท่า:

ก่อนอื่นให้ ssh เข้าสู่ vm docker-machine และสร้างโฟลเดอร์ที่เราจะทำการจับคู่กับ:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

ตอนนี้แชร์โฟลเดอร์ไปที่ VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

ในที่สุด, ssh เข้าสู่ docker-machine อีกครั้งและติดตั้งโฟลเดอร์ที่เราเพิ่งแชร์:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

หมายเหตุ: สำหรับ UID และ GID คุณสามารถใช้จำนวนเต็มใดก็ได้ตราบใดที่ยังไม่ได้ใช้

สิ่งนี้ได้รับการทดสอบตั้งแต่เครื่องเทียบท่า 0.4.1 และนักเทียบท่า 1.8.3 บน OS X El Capitan


1
+1 หลังจากตีหัวฉันหลายชั่วโมงคำตอบของคุณก็ใช้ได้ นี่ควรเป็นส่วนหนึ่งของdocker-machineเอกสาร
Abhijit Sarkar

ทำไมไม่ใช้-vธง?
igracia

1
@igracia -vธงไม่ทำงานอย่างที่คุณคาดหวังใน OS X (หรือ windows) นักเทียบท่าทำงานใน VM เพื่อให้โฟลเดอร์อ้างอิงใน-vจุดไปยังโฟลเดอร์ใน VM ไม่ใช่ในระบบปฏิบัติการราก เทคนิคนี้ใช้ขั้นตอนต่อไปของการแม็พโฟลเดอร์ VM กลับไปยังรูท OS
Patrick Gunderson

1
@PatrickGunderson ในกรณีของฉัน (OS X) โฟลเดอร์อยู่ในโฮสต์ไม่ใช่ใน VM และทำงานได้ดี Docker Tolls ดูแลการส่งออกไปยัง VM และจากที่นั่นไปยังคอนเทนเนอร์
igracia

1
ข้อยกเว้นเดียวสำหรับกฎที่ฉันกล่าวถึงคือ VM จะทำการเมานท์/Usersเพื่อแชร์กับนักเทียบท่าโดยอัตโนมัติ ซึ่งหมายความว่าหากไฟล์การทำงานของคุณอยู่ใน~/*นั้นคุณก็พร้อมที่จะไป หากคุณมีการตั้งค่าสภาพแวดล้อม dev ของคุณให้หมด/developmentหรือสิ่งอื่นนอกเหนือจากที่/Usersคุณกำลังจะมีปัญหาdocs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson

27

ฉันแค่ทดลองกับการทำให้แอป SailsJS ของฉันทำงานภายในคอนเทนเนอร์ Docker เพื่อให้เครื่องทางกายภาพของฉันสะอาด

ฉันใช้คำสั่งต่อไปนี้เพื่อติดตั้งแอปพลิเคชัน SailsJS / NodeJS ของฉันภายใต้ / app:

cd my_source_code_folder
นักเทียบท่าวิ่ง -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc

5
จะทำสิ่งนี้ได้อย่างไรใน Dockerfile
orad

23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

ในระบบของฉันฉันได้แก้ไขคำตอบจาก nhjk มันจะทำงานได้อย่างไร้ที่ติเมื่อคุณเพิ่มการ-tตั้งค่าสถานะ


คุณสามารถสร้าง / อัปเดตไฟล์จาก FS ในเครื่องและดูการเปลี่ยนแปลงภายในคอนเทนเนอร์นักเทียบท่าได้หรือไม่?
Avi Mehenwal

14

ถ้าโฮสต์เป็น windows 10 ดังนั้นแทนที่จะเป็นฟอร์เวิร์ดสแลชให้ใช้ backward slash -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

ตรวจสอบให้แน่ใจว่ามีการแชร์ไดรฟ์โฮสต์ (C ในกรณีนี้) ในกรณีของฉันฉันได้รับแจ้งให้ขออนุญาตแบ่งปันหลังจากเรียกใช้คำสั่งด้านบน


13

บน Mac OS เพื่อติดตั้งโฟลเดอร์/Users/<name>/projects/บน mac ของคุณที่รูทคอนเทนเนอร์:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects


11

อัปเดตเมื่อเดือนกรกฎาคม 2558 - boot2docker สนับสนุนการติดตั้งโดยตรงในขณะนี้ คุณสามารถใช้-v /var/logs/on/host:/var/logs/in/containerโดยตรงจากพรอมต์ Mac ของคุณโดยไม่ต้องติดตั้งสองครั้ง


11

สำหรับผู้ใช้Windows 10สิ่งสำคัญคือต้องมีจุดเชื่อมต่ออยู่ในC:/Users/ไดเรกทอรี ฉันพยายามหลายชั่วโมงเพื่อให้เรื่องนี้ทำงาน โพสต์นี้ช่วยได้ แต่ก็ไม่ชัดเจนในตอนแรกเนื่องจากโซลูชันสำหรับ Windows 10 เป็นความเห็นต่อคำตอบที่ได้รับการยอมรับ นี่คือวิธีที่ฉันทำ:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

จากนั้นเพื่อทดสอบคุณสามารถทำecho TEST > hostTest.txtภายในภาพของคุณ C:/Users/C/Desktop/dockerStorage/คุณควรจะสามารถมองเห็นไฟล์ใหม่นี้ในโฟลเดอร์พื้นที่ท้องถิ่นที่


เครื่องหมายทับสองทางบนเส้นทางเป็นสิ่งที่ทำให้ฉันทำงานได้ดี มันสับสนเพราะฉันใช้-v $(pwd):/var/xxครั้งแรกและใช้งานได้ แต่ส่งผลให้มีไดเรกทอรีว่างเปล่า ฉันใช้ cyg ผ่าน babun
kenchilada

มีปัญหาเดียวกันใน Windows 7 ในขณะที่ใช้ / c / data / ย้ายไดเรกทอรีโฮสต์ภายใต้ / c / Users / <user> / แก้ไขให้ฉัน ขอบคุณ
user8675309

1
เราสามารถเชื่อมโยงไปยังโพสต์ที่ช่วยให้คุณแก้ไขปัญหาได้หรือไม่
PBo

11

ฉันมีปัญหาเดียวกัน บรรทัดคำสั่งของฉันดูเหมือนว่า:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

ปัญหาเกิดจาก 'pwd' ดังนั้นฉันเปลี่ยนเป็น $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

1
มีไว้zเพื่ออะไร
hhh

2
ตัวเลือก z บ่งชี้ว่าเนื้อหาการเชื่อมโยงถูกแชร์ระหว่างหลาย ๆ คอนเทนเนอร์
เจสัน

10

ในฐานะของ Docker 18-CE คุณสามารถใช้docker run -v /src/path:/container/pathเพื่อเชื่อมโยงสองทางของโฟลเดอร์โฮสต์

มีการจับที่สำคัญที่นี่แม้ว่าคุณกำลังทำงานกับ Windows 10 / WSL และมี Docker-CE สำหรับ Windows เป็นโฮสต์ของคุณแล้วเครื่องมือไคลเอ็นต์ docker-ce ใน WSL WSL รู้เกี่ยวกับระบบไฟล์ทั้งหมดในขณะที่โฮสต์ Windows ของคุณรู้เกี่ยวกับไดรฟ์ของคุณเท่านั้น ภายใน WSL คุณสามารถใช้ / mnt / c / projectpath แต่ถ้าคุณพยายามdocker run -v ${PWD}:/projectpathคุณจะพบในโฮสต์ที่ / projectpath / ว่างเปล่าเพราะใน host / mnt ไม่มีความหมายอะไรเลย

หากคุณทำงานจาก / c / projectpath แม้ว่าจะทำแล้วdocker run -v ${PWD}:/projectpathและคุณจะพบว่าในคอนเทนเนอร์ / projectpath จะแสดง / c / projectpath ตามเวลาจริง ไม่มีข้อผิดพลาดหรือวิธีอื่น ๆ ในการตรวจสอบปัญหานี้นอกเหนือจากการเห็นการเมานต์ว่างเปล่าภายในแขกของคุณ

คุณต้องแน่ใจว่า "แชร์ไดรฟ์" ในการตั้งค่า Docker สำหรับ Windows


ฉันประสบปัญหานี้กับ Win10 / WSL และ Docker-CE / docker-ce ว่างเปล่า / projectpath / คุณหมายถึงอะไรโดย "ทำงานจาก / c / projectpath" ฉันพยายามเชื่อมโยง / C / เพื่อ / mnt / C และวิ่งออกมาจากแต่แล้วผมได้รับข้อผิดพลาด/c/projectpath bind mount source path does not exist: /host_mnt/c/projectpath
Steven T. Snyder

ลิงก์นี้แก้ไขปัญหาของฉัน: support.divio.com/local-development/docker/ ...... (นักเทียบท่าบน Windows อนุญาตการติดตั้งจาก / ผู้ใช้ / โดยค่าเริ่มต้นเท่านั้น)
Steven T. Snyder

7

ฉันพบว่าไดเรกทอรีใด ๆ วางอยู่ภายใต้คำสั่งของระบบเช่น/var, /usr, /etcไม่อาจจะติดอยู่ภายใต้ภาชนะ

คำสั่งควรอยู่ที่-vสวิทช์พื้นที่ของผู้ใช้สั่งให้ดีมอนภูตไปติดตั้งโลคัลไดเร็กทอรีกับคอนเทนเนอร์ตัวอย่างเช่น:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}

5

boot2docker ร่วมกับ VirtualBox Guest Additions
วิธีการเมานท์ / ผู้ใช้ไปยัง boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr สร้าง boot2docker.iso แบบกำหนดเองของคุณเองพร้อม VirtualBox Guest Additions (ดูลิงค์ ) หรือดาวน์โหลด http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso และบันทึก เป็น ~ / .boot2docker / boot2docker.iso


ฉันพยายามใช้ iso นั้นและฉันก็ยังเจอปัญหาเดียวกัน ... การใช้คำแนะนำที่โพสต์ในโพสต์นั้นช่วยให้ฉันจัดการมันได้ - โดยทั่วไปฉันต้องบังคับโฟลเดอร์ที่ใช้ร่วมกัน
Jaco Pretorius

ฉันใช้ iso มันสะดุดที่ฉันไม่ได้หยุด Virtual Box VM ก่อนเรียก 'VBoxManage sharedfolder add ... ' cmd ในที่สุดก็ทำให้มันทำงานได้ แต่ขอบคุณมาก
Emile

หมายเหตุ: เหตุผลที่ -v arg ไม่ทำงานผ่าน boot2docker ดูเหมือนจะเป็นสิ่งที่เกี่ยวข้องกับการติดตั้งกับ boot2docker-vm ไม่ใช่โฮสต์จริงของคุณ ซึ่งเป็นเหตุผลที่ฉันเดาส่วน Vboxmanage ช่วยงาน
Emile

5

ฉันจะเชื่อมโยง main_folder กับโฟลเดอร์ test_container ที่มีอยู่ในคอนเทนเนอร์ docker ได้อย่างไร

คำสั่งของคุณด้านล่างถูกต้องเว้นแต่ว่าคุณใช้เครื่อง mac โดยใช้ boot2docker (ขึ้นอยู่กับการอัพเดทในอนาคต) ซึ่งในกรณีนี้คุณอาจพบว่าโฟลเดอร์ว่างเปล่า ดูคำตอบ mattes สำหรับการสอนเกี่ยวกับการแก้ไขนี้

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

ฉันต้องการทำให้การรันนี้โดยอัตโนมัติวิธีการทำโดยไม่ต้องใช้คำสั่ง run -d -v จริงๆ

คุณไม่สามารถหลีกเลี่ยงการใช้คำสั่งเหล่านี้ได้จริงๆพวกมันมีความสำคัญต่อวิธีการทำงานของนักเทียบท่า คุณควรวางมันลงในเชลล์สคริปเพื่อประหยัดเวลาที่คุณจะเขียนมันออกมาซ้ำ ๆ

จะเกิดอะไรขึ้นหาก boot2docker ล่ม ไฟล์นักเทียบท่าเก็บไว้ที่ไหน

หากคุณจัดการเพื่อใช้ -v arg และอ้างอิงเครื่องโฮสต์ของคุณไฟล์นั้นจะปลอดภัยบนโฮสต์ของคุณ

หากคุณใช้ 'นักเทียบท่าสร้าง -t myimage' ด้วย Dockerfile ไฟล์ของคุณจะถูกอบเข้าไปในรูปภาพ

ผมเชื่อว่าภาพนักเทียบท่าของคุณจะถูกเก็บไว้ใน boot2docker-vm ฉันพบสิ่งนี้เมื่อภาพของฉันหายไปเมื่อฉันลบ vm จาก VirtualBox (หมายเหตุฉันไม่รู้ว่า VirtualBox ทำงานอย่างไรดังนั้นภาพอาจยังคงซ่อนอยู่ที่อื่นไม่เห็นนักเทียบท่า)


5

มีปัญหาเดียวกัน พบสิ่งนี้ในเอกสารนักเทียบท่า :

หมายเหตุ: ไดเรกทอรีโฮสต์นั้นขึ้นอยู่กับโฮสต์ ด้วยเหตุผลนี้คุณไม่สามารถเมานต์โฮสต์ไดเรกทอรีจาก Dockerfile คำสั่ง VOLUME ไม่สนับสนุนการส่งโฮสต์ -dir เนื่องจากรูปภาพที่สร้างควรพกพาได้ ไดเรกทอรีโฮสต์จะไม่สามารถใช้ได้กับโฮสต์ที่มีศักยภาพทั้งหมด

ดังนั้นการเมาท์ไดเร็กทอรีโฮสต์การอ่าน / เขียนจึงเป็นไปได้เฉพาะกับ-vพารามิเตอร์ในdocker runคำสั่งเนื่องจากคำตอบอื่น ๆ จะชี้อย่างถูกต้อง


ไดเรกทอรีโฮสต์คืออะไรกันแน่
Nicolas S.Xu

@ NicolasS.Xu เส้นทางบนเครื่องโฮสต์ของนักเทียบท่าที่แท้จริง
J. Scott Elblein

5

นี่คือตัวอย่างของเส้นทาง Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

ในฐานะที่เป็นข้อความด้านในระหว่างการดึงผมนี้ทั้งหมดโดยการต่อสู้กับการหาและพิมพ์เส้นทางซ้ำแล้วซ้ำอีกฉันตัดสินใจที่จะแส้AutoHotkeyสคริปต์ขนาดเล็กเพื่อแปลงเส้นทาง Windows เป็นเส้นทางที่จัดรูปแบบ"Docker Windows " . สิ่งที่ฉันต้องทำคือคัดลอกพา ธ Windows ที่ฉันต้องการใช้เป็นจุดเชื่อมต่อไปยังคลิปบอร์ดกด "คีย์แอพ" บนคีย์บอร์ดและมันจะฟอร์แมตเป็นรูปแบบพา ธ ที่นักเทียบท่าชื่นชม

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

คัดลอกไปยังคลิปบอร์ดของคุณ:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

กดในApps Keyขณะที่เคอร์เซอร์อยู่ที่ที่คุณต้องการบนบรรทัดคำสั่งและมันจะวางที่นี่:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

ประหยัดเวลาได้มากสำหรับฉัน ที่นี่มีไว้สำหรับคนอื่น ๆ ที่อาจพบว่ามีประโยชน์

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 

4

เพื่อให้การทำงานในWindows 10ฉันต้องเปิดหน้าต่างการตั้งค่า Docker จากถาดระบบและไปที่ไดรฟ์ที่ใช้ร่วมกันส่วน

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

จากนั้นฉันก็วิ่งคอนเทนเนอร์นักเทียบท่าตามตัวอย่างด้านบนและตัวอย่างในหน้าการตั้งค่านั้นแนบไปกับ/dataในคอนเทนเนอร์

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

3

โปรดทราบว่าใน Windows คุณจะต้องระบุเส้นทางที่แน่นอน

ทำงานด้านล่างสำหรับฉัน

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

3

ฉันมีปัญหาเดียวกันฉันพยายามเมานต์ C: \ Users \ โฟลเดอร์บนนักเทียบท่า
นี่คือวิธีที่ฉันทำมันบรรทัดคำสั่ง Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>

2

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


2

คุณยังสามารถทำสิ่งนี้กับเว็บแอปพลิเคชันPortainerเพื่อประสบการณ์การรับชมที่แตกต่าง

ขั้นแรกให้ดึงอิมเมจ Portainer:

docker pull portainer/portainer

จากนั้นสร้างโวลุ่มสำหรับ Portainer:

docker volume create portainer_data

สร้างคอนเทนเนอร์ Portainer ด้วย:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

คุณจะสามารถเข้าถึงเว็บแอปด้วยเบราว์เซอร์ของคุณได้ที่ URL นี้: " http: // localhost: 9000 " ในการเข้าสู่ระบบครั้งแรกคุณจะได้รับแจ้งให้ตั้งค่าข้อมูลประจำตัวของผู้ดูแลระบบ Portainer

ในเว็บแอปให้ทำตามเมนูและปุ่มเหล่านี้: (คอนเทนเนอร์> เพิ่มคอนเทนเนอร์> เติมการตั้งค่า > ปรับใช้คอนเทนเนอร์)

ฉันมีปัญหาในการสร้างวอลลุ่ม "mount" ด้วย Portainer และฉันรู้ว่าฉันต้องคลิก "ผูก" เมื่อสร้างวอลลุ่มของคอนเทนเนอร์ ด้านล่างนี้เป็นภาพประกอบของการตั้งค่าการเชื่อมโยงโวลุ่มที่ทำงานกับการสร้างคอนเทนเนอร์ของฉันด้วยโวลุ่มที่เมาท์ซึ่งถูกผูกไว้กับโฮสต์

การตั้งค่าการเชื่อมวอลุ่ม

PS: ฉันใช้ Docker 19.035 และ Portainer 1.23.1

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