如何在Docker容器中裝載主機目錄?




docker volume (9)

2015年7月更新 - boot2docker現在支持直接安裝。 您可以直接從Mac提示符使用-v /var/logs/on/host:/var/logs/in/container ,無需雙重安裝

我正在嘗試將一個主機目錄掛載到Docker容器中,以便在主機上完成的任何更新都反映到Docker容器中。 Google搜索並閱讀碼頭鏈接後,我無法成功。

有人可以指出我在哪裡做錯了。 這是我做的

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

[email protected]:/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 出口

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

  • 我不知道如何檢查boot2docker版本

面臨的問題,問題:

  1. 我如何需要將main_folder鏈接到Docker容器中存在的test_container文件夾?
  2. 我需要自動完成,如何做到這一點,而不真正使用run -d -v命令。
  3. 如果boot2docker崩潰會發生什麼? 碼頭文件在哪裡存儲(除了Dockerfile)?

2個連續的坐騎:我猜這裡的許多帖子可能會使用兩個boot2docker,原因是你沒有看到任何東西,因為你正在從boot2docker掛載一個目錄而不是你的主機。 你基本上需要2次連續的掛載:第一次從你的主機掛載一個目錄到你的系統,第二次掛載從boot2docker到你的容器的新目錄,如下所示:

1.在boot2docker上掛載本地系統

sudo mount -t vboxsf hostfolder /boot2dockerfolder

2.在linux容器上掛載boot2docker文件

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

那麼當你在容器文件夾內時,你會看到你的主文件夾的內容



如何將main_folder鏈接到Docker容器中存在的test_container文件夾?

以下命令是正確的,除非您在使用boot2docker的mac上(取決於將來的更新),在這種情況下,您可能會找到該文件夾為空。 請參閱mattes回答關於糾正此問題的教程。

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

我需要自動運行,如何在不使用run -d -v命令的情況下執行此操作。

你不能真正擺脫這些命令的使用,它們是碼頭工作的固有方式。 您最好將它們放入shell腳本中,以免重複寫出它們。

如果boot2docker崩潰會發生什麼? 碼頭文件存儲在哪裡?

如果您設法使用-v arg並引用您的主機,那麼這些文件在您的主機上將是安全的。

如果你已經使用'docker build -t myimage'。 與Dockerfile然後你的文件將被烘焙到圖像。

我相信你的碼頭圖像存儲在boot2docker-vm中。 當我從VirtualBox中刪除虛擬機時,我發現了這種情況。 (注意,我不知道Virtualbox是如何工作的,所以圖像可能仍然隱藏在其他地方,只是對泊塢窗不可見)。


我只是嘗試讓我的SailsJS應用程序在Docker容器中運行,以保持我的物理機器清潔。

我正在使用以下命令在/ app下掛載我的SailsJS / NodeJS應用程序:

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

我發現像/var/usr/etc這樣的系統指令下的任何目錄都不能在容器下掛載。

該指令應該在用戶空間-v開關指示docker守護程序將本地目錄掛載到容器,例如:

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

有同樣的問題。 在docker文檔中找到了這個:

注意:主機目錄本質上取決於主機。 因為這個原因,你不能從Dockerfile掛載一個主機目錄,VOLUME指令不支持傳遞一個host-dir,因為內置映像應該是可移植的。 主機目錄在所有可能的主機上都不可用。

因此,只有在docker run命令中使用-v參數才能掛載一個讀/寫主機目錄,因為其他答案可以正確指出。


有幾種方法可以做到這一點。 最簡單的方法是使用dockerfile ADD命令,如下所示:

ADD . /path/inside/docker/container

但是,在構建dockerfile後在主機上對此目錄所做的任何更改都不會顯示在容器中。 這是因為在構建容器時,docker將目錄壓縮為.tar並將該上下文永久上傳到容器中。

第二種方法是嘗試執行此操作,即裝入卷。 由於嘗試盡可能便攜,因此無法將主機目錄映射到dockerfile中的docker容器目錄,因為主機目錄可能會根據您運行的計算機而發生變化。 要將主機目錄映射到Docker容器目錄,需要在使用docker run時使用-v標誌,如下所示:

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

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標誌時,它的工作完美無瑕。







boot2docker