如何在Docker容器中挂载主机目录

897

我正在尝试将主机目录挂载到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链接到docker容器内部存在的test_container文件夹中,应该怎样做?
  2. 我需要自动完成这个过程。不使用run -d -v命令,有什么方法可以实现?
  3. 如果boot2docker崩溃了会发生什么?除了Dockerfile之外,Docker文件存储在哪里?

2
FYI,根据此评论,这个问题在 Docker 中已经被解决了。我正在我的 Mac 上使用 Boot2Docker。我可以使用 -v 选项,将我的本地目录挂载到容器中。 - Marco
1
以下任何答案都不符合原帖中的第二个要求。他们想要从Dockerfile中实现,而不是使用docker run命令。我也在思考。 - Josh Albert
请不要给您的图像打上“latest”的标签!https://medium.com/@mccode/the-misunderstood-docker-tag-latest-af3babfd6375 - mteam88
27个回答

6
为了在 Windows 10 上实现这一点,我需要从系统托盘中打开 Docker 设置窗口并转到“共享驱动器”部分。
然后我选中旁边的“C”框。Docker 请求我的桌面凭据以获得写入我的用户文件夹的授权。
接着,我按照上述示例和设置页面上的示例运行了 Docker 容器,并将其连接到容器中的“/data”。
docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

5
请注意在Windows中你需要提供绝对路径。 以下方法适用于我。
docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

5

我尝试使用那个ISO文件,但仍然遇到了相同的问题...不过,按照那篇帖子中概述的步骤帮助我解决了问题 - 我基本上不得不强制共享文件夹。 - Jaco Pretorius
我使用了ISO文件,但在调用“VBoxManage sharedfolder add ...”命令之前没有停止Virtual Box虚拟机,导致出现了错误。最终我解决了所有问题,非常感谢。 - Emile
请注意:-v参数在boot2docker中无法正常工作,这似乎与它挂载到boot2docker-vm而不是实际主机有关。这就是为什么我猜Vboxmanage部分可以帮助它工作的原因。 - Emile

3

引用自官方网站

  1. 确保您没有任何之前的入门容器正在运行。

  2. 从应用程序目录中运行以下命令。

  • x86-64 Mac或Linux设备:

    docker run -dp 3000:3000 \
      -w /app -v "$(pwd):/app" \
      node:12-alpine \
      sh -c "yarn install && yarn run dev"
    
  • Windows(PowerShell):

    docker run -dp 3000:3000 \
      -w /app -v "$(pwd):/app" \
      node:12-alpine \
      sh -c "yarn install && yarn run dev"
    
  • 苹果硅Mac或其他ARM64设备:

    docker run -dp 3000:3000 \\
      -w /app -v "$(pwd):/app" \\
      node:12-alpine \\
      sh -c "apk add --no-cache python2 g++ make && yarn install && yarn run dev"
    

解释:

  • dp 3000:3000 - 和之前一样。以后台模式运行并创建端口映射
  • w /app - 设置“工作目录”或命令将从中运行的当前目录
  • v "$(pwd):/app" - 将主机中的当前目录绑定到容器中的/app目录
  • node:12-alpine - 要使用的镜像。

请注意,这是我们应用程序的基础镜像,来自 Dockerfile sh -c "yarn install && yarn run dev" - 命令。

我们使用 sh(alpine没有Bash)启动shell,并运行 yarn install 来安装所有依赖项,然后运行yarn run dev。 如果我们查看 package.json,我们将看到dev脚本正在启动nodemon


3

我遇到了同样的问题,我正在尝试将 C:\Users\ 文件夹挂载到 Docker 上。
以下是我在 Docker Toolbox 命令行上的操作:

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

3
你也可以使用Portainer web应用程序进行操作,获得不同的视觉体验。
首先拉取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的Web应用程序:"http://localhost:9000"。在第一次登录时,系统将提示您设置Portainer管理员凭据。
在Web应用程序中,请按照以下菜单和按钮操作:(容器>添加容器> 填写设置 >部署容器)
我在使用Portainer创建“挂载”卷时遇到了问题,后来我意识到在创建容器的卷时需要点击“绑定”。以下是一个示例,显示了成功创建带有已挂载卷绑定到主机的容器的卷绑定设置。

volume binding settings

附言:我使用的是 Docker 19.035 和 Portainer 1.23.1


2

我有同样的需求,需要从容器中挂载主机目录,我使用了卷挂载命令。但是在测试过程中发现它也在容器内创建文件,但经过一些调查发现这些只是符号链接,实际上使用的是主机机器的文件系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接