Cách gắn thư mục máy chủ vào bộ chứa Docker


618

Tôi đang cố gắn một thư mục máy chủ vào một container Docker để mọi cập nhật được thực hiện trên máy chủ được phản ánh vào các container Docker.

Tôi đang làm gì sai ở đâu. Đây là những gì tôi đã làm:

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

  • Tôi không biết cách kiểm tra phiên bản boot2docker

Câu hỏi, vấn đề phải đối mặt:

  1. Làm thế nào để tôi cần liên kết main_folder với thư mục test_container có trong container docker?
  2. Tôi cần phải làm điều này tự động. Làm thế nào để tôi làm điều đó mà không thực sự sử dụng run -d -vlệnh?
  3. Điều gì xảy ra nếu boot2docker gặp sự cố? Các tệp Docker được lưu trữ ở đâu (ngoài Dockerfile)?

2
FYI, điều này dường như được cố định trong docker như nhận xét này. Tôi đang sử dụng boot2docker trên máy mac. Tôi có thể sử dụng tùy chọn -v và thư mục cục bộ của tôi được gắn kết tất cả các cách vào container.
Marco

Câu trả lời:


509

Có một vài cách bạn có thể làm điều này. Cách đơn giản nhất để làm như vậy là sử dụng ADDlệnh dockerfile như vậy:

ADD . /path/inside/docker/container

Tuy nhiên, mọi thay đổi được thực hiện đối với thư mục này trên máy chủ sau khi xây dựng dockerfile sẽ không hiển thị trong vùng chứa. Điều này là do khi xây dựng một container, docker nén thư mục vào một .tarvà tải bối cảnh đó vào container vĩnh viễn.

Cách thứ hai để làm điều này là cách bạn đã cố gắng, đó là gắn kết một âm lượng. Do cố gắng di động hết mức có thể, bạn không thể ánh xạ thư mục máy chủ vào thư mục chứa docker trong dockerfile, vì thư mục máy chủ có thể thay đổi tùy thuộc vào máy bạn đang chạy. Để ánh xạ thư mục máy chủ đến thư mục chứa docker, bạn cần sử dụng -vcờ khi sử dụng docker chạy như vậy:

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

Tôi đã thử như thế này THÔNG TIN] [ARG ...] Chạy lệnh trong vùng chứa mới -P, --publish-all = false: Xuất bản tất cả các cổng được hiển thị lên giao diện máy chủ -a, --attach = []: Đính kèm vào stdin, stdout hoặc stderr. -c, --cpu-Shares = 0: Cổ phiếu CPU (trọng lượng tương đối)
Kishore Vaishnav

2
bạn có thể có cả THÊM. và -v âm lượng gắn kết cùng một lúc. sử dụng app_dir mặc định nếu không chỉ định mount máy chủ?
alexzg

@alexzg Tôi không nghĩ chúng ta chỉ có thể được ưu tiên. Ngoài ra, tôi không rõ về app_dir mặc định điểm 2 của bạn ... máy chủ lưu trữ ..?
Kishore Vaishnav

35
Điều này làm việc cho tôi trên mac os x với docker-machine và VirtualBox. Một cảnh báo tôi đã phát hiện bằng thử nghiệm và lỗi là thư mục máy chủ phải là một đường dẫn đầy đủ và không phải là một đường dẫn tương đối.
jbustamovej

25
ADDthực sự không "gắn" nó sao chép tập tin vào thùng chứa nó bên trong.
kev

200

Người dùng của câu hỏi này đã sử dụng Docker version 0.9.1, build 867b2a9, tôi sẽ cung cấp cho bạn câu trả lời cho phiên bản docker> = 17,06.

Những gì bạn muốn, giữ cho thư mục cục bộ được đồng bộ hóa trong thư mục container, được thực hiện bằng cách gắn âm lượng với loại bind. Điều này sẽ liên kết các thư mục nguồn (hệ thống của bạn) và thư mục đích (tại thùng chứa docker). Nó gần giống như việc gắn một thư mục trên linux.

Theo tài liệu của Docker , lệnh thích hợp để gắn kết bây giờ mountthay vì -v. Đây là tài liệu của nó:

  • --mount: Bao gồm nhiều cặp khóa-giá trị, được phân tách bằng dấu phẩy. Mỗi cặp khóa / giá trị có dạng một <key>=<value>tuple. Các --mountcú pháp là hơn tiết hơn -vhoặc --volume, nhưng thứ tự của các phím là không đáng kể, và giá trị của lá cờ là dễ hiểu hơn.

  • Các typecủa núi, có thể bind, volumehoặc tmpfs. (Chúng tôi sẽ sử dụng liên kết )

  • Các sourcegắn kết. Đối với các liên kết gắn kết, đây là đường dẫn đến tệp hoặc thư mục trên máy chủ Docker daemon. Có thể được chỉ định là sourcehoặc src.

  • Các destinationdiễn như giá trị của nó con đường nơi mà các tập tin hoặc thư mục sẽ được gắn trong thùng sơn. Có thể được quy định như destination, dsthoặc target.

Vì vậy, để gắn kết thư mục hiện tại (nguồn) với /test_container(đích) chúng ta sẽ sử dụng:

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

Nếu các tham số gắn kết này có khoảng trắng, bạn phải đặt dấu ngoặc kép xung quanh chúng. Khi tôi biết họ không, tôi sẽ sử dụng `pwd`thay thế:

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

Bạn cũng sẽ phải đối phó với sự cho phép tập tin, xem bài viết này .


2
Tôi đã đưa ra câu trả lời của bạn vì tôi thích cách nó ngắn gọn và nó không sai, nhưng bạn có thể muốn cập nhật một chút về câu trả lời của tôi tại stackoverflow.com/a/51829247/901899
rainabba

2
Tôi đoán tài liệu đã được cập nhật kể từ câu trả lời này, vì ngay bây giờ nó dường như đề xuất khối lượng, thay vì gắn kết. Đáng để đi mặc dù nó, trước khi cam kết với bất cứ điều gì.
Sipty

1
@Sipty có thể đề cập đến các vấn đề sau: " Nếu bạn đang phát triển các ứng dụng Docker mới, hãy xem xét sử dụng các khối lượng được đặt tên thay thế. Bạn không thể sử dụng các lệnh Docker CLI để trực tiếp quản lý các liên kết gắn kết. "
Aluthren

81

2 lần gắn kết liên tiếp: Tôi đoán nhiều bài đăng ở đây có thể đang sử dụng hai boot2docker, lý do bạn không thấy gì là bạn đang gắn một thư mục từ boot2docker chứ không phải từ máy chủ của bạn.

Về cơ bản bạn cần 2 lần gắn kết liên tiếp:

người đầu tiên gắn thư mục từ máy chủ của bạn vào hệ thống của bạn

thứ hai để gắn thư mục mới từ boot2docker vào thùng chứa của bạn như thế này:

  • 1) Gắn hệ thống cục bộ trên boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Gắn boot2dockertập tin vào thùng chứa linux

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

Sau đó, khi bạn lsbên trong, containerfolderbạn sẽ thấy nội dung của bạn hostfolder.


1
Câu trả lời tốt nhất. Tôi phải thêm rằng hostfolder (dưới windows) trong lệnh mount đang tham chiếu đến tên chia sẻ thư mục. Lệnh xuất hiện với net sharelệnh bên trong terminal terminal (cmd). Và bạn phải thêm thư mục đó dưới dạng thư mục dùng chung với GUI VirtualBox (sử dụng cùng tên nếu bạn tuân theo logic của tôi). Nếu bạn bỏ qua để chia sẻ nó, nó sẽ hoạt động, nhưng bạn sẽ gặp vấn đề với quyền và làm mới hiệu suất.
Kir Kanos

Làm thế nào để lệnh mount biết máy chủ lưu trữ ở đâu / boot2dockerfolder?
alfonsodev

Tôi đã gặp lỗi : mount: unknown filesystem type 'vboxsf', sử dụng máy khách và máy chủ Ubuntu
nnyby

"vboxsf" là trình điều khiển "hệ thống tệp" thư mục chia sẻ VirtualBox. Nó phải được cấu hình vào VM bằng cách cài đặt các phần mở rộng VirtualBox. Hình ảnh boot2docker không được cài đặt. VirtualBox có chức năng "thiết bị" để "chèn" hình ảnh ISO Bổ sung VirtualBox dưới dạng âm lượng ảo. Thông thường, bạn có thể gắn kết này trên mount bằng cách sử dụng mount / dev / cdrom / mnt, đi vào / mnt và chạy bash VBoxLinuxAdditions. Nó có thể cần cài đặt gcc, kernel hoặc các phụ thuộc khác.
Andrew Wolfe

mount.vboxsf: việc cài đặt không thành công với lỗi: Không có tập tin hoặc thư mục như vậy mount: việc gắn mymapprintername trên / boot2dockerfolder không thành công: Không có tập tin hoặc thư mục như vậy
vee

71

bạn có thể sử dụng tùy chọn -v từ cli, cơ sở này không khả dụng qua Dockerfile

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

trong đó host_dir là thư mục từ máy chủ mà bạn muốn gắn kết. bạn không cần phải lo lắng về thư mục của container nếu nó không tồn tại docker sẽ tạo ra nó.

Nếu bạn thực hiện bất kỳ thay đổi nào trong host_dir từ máy chủ (dưới đặc quyền gốc), nó sẽ hiển thị với container và ngược lại.


6
Thật là một ví dụ đẹp, rõ ràng, chính xác để minh họa tùy chọn gắn máy chủ. Có lẽ nó có thể được cải thiện bằng cách sử dụng thư mục thực: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashnơi máy chủ /tmpsẽ được gắn trên container /tmp. Bây giờ người ta có thể touch /tmp/hello-worldtừ container và xem tập tin xuất hiện trên máy chủ.
Stephan Henningsen

3
Hoạt động hoàn hảo. Nhưng việc gắn kết theo cách này sẽ đặt chủ sở hữu thư mục là root và điều này cũng hy vọng container sẽ được chạy dưới quyền root. Làm thế nào để chúng ta gắn dir là không root khi container được chạy dưới dạng không root?
Arun

33

Có thể là bạn sử dụng docker trên OS X thông qua boot2dockerhoặc một cái gì đó tương tự.

Tôi đã thực hiện cùng một trải nghiệm - lệnh là chính xác nhưng không có gì (hợp lý) được gắn trong container, dù sao đi nữa.

Hóa ra - nó đã được giải thích trong tài liệu về docker . Khi bạn gõ docker run -v /var/logs/on/host:/var/logs/in/container ...thì /var/logs/on/hostthực sự được ánh xạ từ boot2dockerhình ảnh VM, không phải máy Mac của bạn.

Bạn sẽ phải chuyển thư mục được chia sẻ thông qua VM đến máy chủ thực tế của bạn (máy Mac trong trường hợp của tôi).


1
Cảm ơn! Điều này giúp tôi với một vấn đề liên quan xa. Postgres chạy bên trong Docker đã liên kết với VBox IP, không phải localhost, như nó sẽ có nếu không chạy trên OS X.
Peter Becich

2
URL đó đến tài liệu docker không còn hợp lệ
Digitaldavenyc

haha trò đùa hay nhất từ ​​trước đến giờ .. họ thực sự có thể đã đưa ra một gợi ý hay như vậy.
dùng2834172

2
Liên kết tài liệu của bạn là 404
Yếu tố huyền bí

3
Tôi tò mò muốn xem một ví dụ về đường ống thư mục được chia sẻ thông qua VM đến máy chủ thực tế.
Derek

28

[CẬP NHẬT] Kể từ ~ tháng 6 năm 2017, Docker cho Mac sẽ xử lý tất cả các phần khó chịu của việc này khi bạn phải làm phiền với VirtualBox. Nó cho phép bạn ánh xạ cơ bản mọi thứ trên máy chủ lưu trữ cục bộ của mình bằng cách sử dụng /privatetiền tố. Thêm thông tin ở đây . [/ CẬP NHẬT]

Tất cả các câu trả lời hiện tại nói về Boot2docker. Vì hiện tại không được ủng hộ cho docker-machine, nên nó hoạt động cho docker-machine:

Đầu tiên, ssh vào vm docker-machine và tạo thư mục chúng ta sẽ ánh xạ tới:

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

Bây giờ chia sẻ thư mục lên VirtualBox:

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

Cuối cùng, ssh vào docker-machine lần nữa và gắn thư mục chúng ta vừa chia sẻ:

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

Lưu ý: đối với UID và GID, về cơ bản bạn có thể sử dụng bất kỳ số nguyên nào miễn là chúng chưa được sử dụng.

Điều này đã được thử nghiệm kể từ docker-machine 0.4.1 và docker 1.8.3 trên OS X El Capitan.


1
+1. Sau vài giờ đập đầu tôi, câu trả lời của bạn đã có hiệu quả. Đây phải là một phần của docker-machinetài liệu.
Abhijit Sarkar

Tại sao không sử dụng -vcờ?
igracia

1
@igracia -vcờ không hoạt động như bạn mong đợi trong OS X (hoặc windows). Docker chạy trong VM để thư mục được tham chiếu -vđến các thư mục trong VM, không phải trong hệ điều hành gốc. Kỹ thuật này thực hiện bước tiếp theo để ánh xạ thư mục VM trở lại hệ điều hành gốc.
Patrick Gunderson

1
@PatrickGunderson Trong trường hợp của tôi (OS X), thư mục nằm trong máy chủ, không phải trong VM và nó hoạt động tốt. Docker Tolls đảm nhiệm việc xuất nó sang VM và từ đó đến container.
igracia

1
Một ngoại lệ cho quy tắc mà tôi đã đề cập là VM sẽ tự động gắn kết /Usersđể chia sẻ với docker. Điều đó có nghĩa là nếu các tệp làm việc của bạn nằm trong ~/*thì bạn tốt để đi. Nếu bạn thiết lập môi trường dev của bạn hết /developmenthoặc bất cứ điều gì khác ngoài /Usersbạn sẽ gặp vấn đề docs.docker.com/engine/userguide/containers/dockervolume
Patrick Gunderson

27

Tôi chỉ đang thử nghiệm để ứng dụng SailsJS của tôi chạy bên trong thùng chứa Docker để giữ cho máy vật lý của tôi sạch sẽ.

Tôi đang sử dụng lệnh sau để gắn ứng dụng SailsJS / NodeJS của mình trong / app:

cd my_source_code_folder
docker chạy -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc

5
Làm thế nào có thể làm điều này trong 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

Trong hệ thống của tôi, tôi đã sửa câu trả lời từ nhjk, nó hoạt động hoàn hảo khi bạn thêm -tcờ.


Bạn có thể tạo / cập nhật tệp từ FS cục bộ và xem các thay đổi bên trong bộ chứa docker không?
Avi Mehenwal

14

Nếu máy chủ là windows 10 thì thay vì dấu gạch chéo về phía trước, hãy sử dụng dấu gạch chéo ngược -

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

Đảm bảo ổ đĩa được chia sẻ (C trong trường hợp này). Trong trường hợp của tôi, tôi đã nhận được lời nhắc xin phép chia sẻ sau khi chạy lệnh trên.


13

Trên Mac OS, để gắn thư mục /Users/<name>/projects/trên máy Mac của bạn vào thư mục gốc của thùng chứa:

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

ls /projects


11

Cập nhật tháng 7 năm 2015 - boot2docker hiện hỗ trợ gắn trực tiếp. Bạn có thể sử dụng -v /var/logs/on/host:/var/logs/in/containertrực tiếp từ dấu nhắc Mac của mình mà không cần gắn đôi


11

Đối với người dùng Windows 10 , điều quan trọng là phải có điểm gắn kết trong C:/Users/thư mục. Tôi đã cố gắng trong nhiều giờ để làm việc này. Bài đăng này đã giúp nhưng ban đầu nó không rõ ràng vì giải pháp cho Windows 10 là một nhận xét cho câu trả lời được chấp nhận. Đây là cách tôi đã làm nó:

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

Sau đó, để kiểm tra nó, bạn có thể làm echo TEST > hostTest.txtbên trong hình ảnh của bạn. Bạn sẽ có thể thấy tệp mới này trong thư mục máy chủ cục bộ tại C:/Users/C/Desktop/dockerStorage/.


Các dấu gạch chéo trên đường dẫn là những gì làm cho nó hoạt động với tôi. Thật khó hiểu vì tôi đã sử dụng -v $(pwd):/var/xxđầu tiên và điều đó đã làm việc, nhưng kết quả là một thư mục trống. Tôi đang chạy cyg qua babun.
kenchilada

Có vấn đề tương tự trong Windows 7 khi sử dụng / c / data /, di chuyển thư mục máy chủ trong / c / Users / <user> / đã giải quyết nó cho tôi. Cảm ơn.
dùng8675309

1
chúng tôi có thể có một liên kết đến bài viết giúp bạn giải quyết vấn đề không?
PBo

11

Tôi đã có cùng một vấn đề. Dòng lệnh của tôi trông như thế này:

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

Vấn đề là với 'pwd'. Vì vậy, tôi đã thay đổi thành $ (pwd):

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

1
Để làm gì z?
hhh

2
Tùy chọn z chỉ ra rằng nội dung gắn kết liên kết được chia sẻ giữa nhiều container.
Jason

10

Kể từ Docker 18-CE, bạn có thể sử dụng docker run -v /src/path:/container/pathđể thực hiện ràng buộc 2 chiều của thư mục máy chủ.

Có một nhược điểm lớn ở đây mặc dù nếu bạn đang làm việc với Windows 10 / WSL và có Docker-CE cho Windows làm máy chủ của bạn và sau đó là công cụ máy khách docker-ce trong WSL. WSL biết về toàn bộ / hệ thống tập tin trong khi máy chủ Windows của bạn chỉ biết về các ổ đĩa của bạn. Bên trong WSL, bạn có thể sử dụng / mnt / c / projectpath, nhưng nếu bạn cố gắng docker run -v ${PWD}:/projectpath, bạn sẽ thấy trong máy chủ đó / projectpath / trống vì trên máy chủ / mnt không có nghĩa gì.

Nếu bạn làm việc từ / c / projectpath và THEN làm docker run -v ${PWD}:/projectpathvà bạn S find thấy rằng trong container, / projectpath sẽ phản ánh / c / projectpath trong thời gian thực. Không có lỗi hoặc bất kỳ cách nào khác để phát hiện vấn đề này ngoài việc nhìn thấy các gắn kết trống bên trong khách của bạn.

Bạn cũng phải chắc chắn "chia sẻ ổ đĩa" trong cài đặt Docker cho Windows.


Tôi đang gặp vấn đề này với Win10 / WSL và Docker-CE / docker-ce. Trống / dự án /. Bạn có ý nghĩa gì khi "làm việc từ / c / projectpath"? Tôi đã thử liên kết / c / đến / mnt / c và chạy từ /c/projectpathđó nhưng sau đó tôi gặp lỗi bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder

Liên kết này đã giải quyết vấn đề của tôi: support.divio.com/local-development/docker/, (Docker trên Windows chỉ cho phép gắn kết từ / Users / theo mặc định)
Steven T. Snyder

7

Tôi thấy rằng bất kỳ thư mục đặt dưới chỉ thị hệ thống như /var, /usr, /etckhông thể gắn dưới thùng sơn.

Lệnh nên ở -vcông tắc không gian của người dùng hướng dẫn docker daemon gắn thư mục cục bộ vào container, ví dụ:

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

5

boot2docker cùng với VirtualBox Guest Additions
Cách gắn kết / Người dùng vào boot2docker

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

tl; dr Xây dựng boot2docker.iso tùy chỉnh của riêng bạn với VirtualBox Guest Additions (xem liên kết ) hoặc tải xuống http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso và lưu nó đến ~ / .boot2docker / boot2docker.iso.


Tôi đã thử sử dụng iso đó và tôi vẫn gặp phải vấn đề tương tự ... Sử dụng các hướng dẫn được nêu trong bài đăng đó đã giúp tôi sắp xếp nó ra - về cơ bản tôi phải buộc thư mục dùng chung.
Jaco Pretorius

Tôi đã sử dụng iso, nó vấp phải một điều rằng tôi đã không dừng VM Virtual Box trước khi gọi 'VBoxManage sharedfolder add ...' cmd. Cuối cùng tất cả đã làm việc mặc dù rất cảm ơn.
Emile

Lưu ý: lý do -v arg không hoạt động thông qua boot2docker, rõ ràng là một cái gì đó để gắn với boot2docker-vm chứ không phải máy chủ thực tế của bạn. đó là lý do tại sao tôi đoán phần Vboxmanage giúp nó hoạt động.
Emile

5

Làm cách nào để liên kết main_folder với thư mục test_container có trong container docker?

Lệnh của bạn dưới đây là chính xác, trừ khi trên mac của bạn sử dụng boot2docker (tùy thuộc vào các bản cập nhật trong tương lai) trong trường hợp bạn có thể tìm thấy thư mục trống. Xem câu trả lời mattes cho một hướng dẫn về sửa lỗi này.

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

Tôi cần làm cho nó chạy tự động, làm thế nào để làm điều đó mà không thực sự sử dụng lệnh run -d -v.

Bạn thực sự không thể tránh khỏi việc sử dụng các lệnh này, chúng thực chất là cách thức hoạt động của docker. Tốt nhất bạn nên đặt chúng vào một tập lệnh shell để lưu bạn viết chúng ra nhiều lần.

Điều gì xảy ra nếu boot2docker gặp sự cố? Các tập tin docker được lưu trữ ở đâu?

Nếu bạn quản lý để sử dụng -v arg và tham chiếu máy chủ của mình thì các tệp sẽ an toàn trên máy chủ của bạn.

Nếu bạn đã sử dụng 'docker build -t myimage.' với Dockerfile thì các tệp của bạn sẽ được đưa vào hình ảnh.

Hình ảnh docker của bạn, tôi tin rằng, được lưu trữ trong boot2docker-vm. Tôi phát hiện ra điều này khi hình ảnh của tôi biến mất khi tôi xóa vm khỏi VirtualBox. (Lưu ý, tôi không biết Virtualbox hoạt động như thế nào, vì vậy hình ảnh có thể vẫn bị ẩn ở một nơi khác, chỉ không hiển thị với docker).


5

Có cùng một vấn đề. Tìm thấy điều này trong tài liệu docker :

Lưu ý: Thư mục máy chủ, về bản chất, phụ thuộc vào máy chủ. Vì lý do này, bạn không thể gắn thư mục máy chủ từ Dockerfile, lệnh VOLUME không hỗ trợ chuyển một máy chủ lưu trữ, bởi vì hình ảnh được xây dựng nên có thể mang theo được. Một thư mục máy chủ sẽ không có sẵn trên tất cả các máy chủ tiềm năng.

Vì vậy, việc gắn một thư mục máy chủ đọc / ghi chỉ có thể với -vtham số trong docker runlệnh, vì các câu trả lời khác chỉ ra chính xác.


Thư mục máy chủ chính xác là gì?
Nicolas S.Xu

@ NicolasS.Xu Bất kỳ đường dẫn nào trên máy chủ docker thực tế.
J. Scott Elblein

5

Đây là một ví dụ với đường dẫn Windows:

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

Một ghi chú bên lề, trong suốt quá trình nhổ tóc này, phải vật lộn với việc tìm ra và lặp đi lặp lại nhiều lần, tôi quyết định lấy một đoạn AutoHotkeyscript nhỏ để chuyển một đường dẫn Windows sang "Docker Windows đường dẫn được định dạng " . Bằng cách này, tất cả những gì tôi phải làm là sao chép bất kỳ đường dẫn Windows nào tôi muốn sử dụng làm điểm gắn kết vào bảng tạm, nhấn "Khóa ứng dụng" trên bàn phím và nó sẽ định dạng nó thành định dạng đường dẫn mà Docker đánh giá cao.

Ví dụ:

Sao chép này vào clipboard của bạn:

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

nhấn Apps Keytrong khi con trỏ là nơi bạn muốn nó trên dòng lệnh và nó sẽ dán cái này vào đó:

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

Tiết kiệm rất nhiều thời gian cho tôi. Ở đây nó dành cho bất cứ ai khác có thể thấy nó hữu ích.

; --------------------------------------------------------------------------------------------------------------
;
; 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

Để làm việc này trong Windows 10, tôi đã phải mở cửa sổ Cài đặt Docker từ khay hệ thống và đi đến phần Ổ đĩa chung .

Sau đó tôi kiểm tra hộp bên cạnh C . Docker yêu cầu thông tin đăng nhập trên máy tính của tôi để có được quyền ghi vào thư mục Người dùng của tôi.

Sau đó, tôi chạy container docker theo các ví dụ ở trên và cũng là ví dụ trên trang cài đặt đó, đính kèm /datatrong container.

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

3

Lưu ý rằng trong Windows bạn sẽ phải cung cấp đường dẫn tuyệt đối.

Dưới đây làm việc cho tôi.

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

3

Tôi gặp vấn đề tương tự, tôi đã cố gắn thư mục C: \ Users \ trên docker,
đây là cách tôi đã thực hiện nó Dòng lệnh Docker Toolbox

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

2

Tôi có cùng một yêu cầu để gắn thư mục máy chủ từ container và tôi đã sử dụng lệnh mount âm lượng. Nhưng trong quá trình thử nghiệm nhận thấy rằng nó cũng tạo các tệp bên trong container nhưng sau khi đào tìm thấy chúng chỉ là các liên kết tượng trưng và hệ thống tệp thực tế được sử dụng máy chủ mẫu.


2

Bạn cũng có thể làm điều này với ứng dụng web Portainer để có trải nghiệm hình ảnh khác.

Đầu tiên kéo hình ảnh Portainer:

docker pull portainer/portainer

Sau đó tạo một âm lượng cho Portainer:

docker volume create portainer_data

Đồng thời tạo một bộ chứa 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

Bạn sẽ có thể truy cập ứng dụng web bằng trình duyệt của mình tại URL này: " http: // localhost: 9000 ". Ở lần đăng nhập đầu tiên, bạn sẽ được nhắc đặt thông tin đăng nhập của quản trị viên Portainer.

Trong ứng dụng web, hãy làm theo các menu và nút sau: (Container> Thêm vùng chứa> Cài đặt điền > Triển khai Container)

Tôi gặp khó khăn khi tạo âm lượng "gắn kết" với Portainer và tôi nhận ra rằng tôi phải nhấp vào "liên kết" khi tạo âm lượng của bộ chứa. Dưới đây là một minh họa về cài đặt liên kết âm lượng hoạt động cho việc tạo vùng chứa của tôi với âm lượng được gắn kết được liên kết với máy chủ.

cài đặt ràng buộc âm lượng

PS: Tôi đang sử dụng Docker 19.035 và Portainer 1.23.1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.