我正在尝试将主机目录装载到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$树.├── Dockerfile文件└── 主文件夹├── tfile1.text├── tfile2.txt文件├── tfile3.txt文件└── tfile4.txt文件

1个目录,5个文件基肖尔$pwd/用户/kishore/tdockkishore$docker build--tag=k3_s3:最新。

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运行-d-v/Users/kishore/main_folder:/test_container k3_s3:最新c9f9a7e09c54ee1c2c966f15c963b4af320b5203b8c46689033c1ab8872a0漏洞$docker运行-i-t k3_s3:最新/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#退出exitkishore$docker-vDocker版本0.9.1,内部版本867b2a9

我不知道如何检查boot2docker版本

问题和面临的问题:

如何将main_folder链接到docker容器中的test_container文件夹?我需要自动完成。如何在不真正使用run-d-v命令的情况下做到这一点?如果boot2docker崩溃会发生什么?Docker文件存储在哪里(除了Dockerfile)?


有几种方法可以做到这一点。最简单的方法是使用dockerfile ADD命令,如下所示:

ADD . /path/inside/docker/container

但是,在构建dockerfile之后,在主机上对该目录所做的任何更改都不会显示在容器中。这是因为在构建容器时,docker将目录压缩为.tar,并将该上下文永久上传到容器中。

第二种方法是尝试装载卷。由于尽可能地可移植,您无法将主机目录映射到dockerfile中的docker容器目录,因为主机目录可能会根据您正在运行的计算机而改变。要将主机目录映像到docker容器,您需要在使用dockerrun时使用-v标志,例如:

# Run a container using the `alpine` image, mount the `/tmp`
# directory from your host into the `/container/directory`
# directory in your container, and run the `ls` command to
# show the contents of that directory.
docker run \
    -v /tmp:/container/directory \
    alpine \
    ls /container/directory

您是否可以通过boot2docker或类似方式在OS X上使用docker。

我也有过同样的经历——命令是正确的,但无论如何,容器中没有装入任何(合理的)内容。

事实证明,docker文档中已经对此进行了解释。当您键入docker run-v/var/logs/on/host:/var/logs/in/container。。。那么/var/logs/on/host实际上是从boot2docker VM映像映射的,而不是从Mac映射的。

您必须通过虚拟机将共享文件夹传输到实际主机(在我的情况下是Mac)。


boot2docker和VirtualBox来宾添加如何将/Users装入boot2docker

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

tl;dr使用VirtualBox Guest构建自己的自定义boot2docker.iso添加(参见链接)或下载http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso并将其保存到~/.boot2docker/boot2docker.iso。


您可以从cli中使用-v选项,该工具无法通过Dockerfile使用

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

其中host_dir是要装载的主机目录。如果容器的目录不存在,您不必担心,docker会创建它。

如果您从主机(在root权限下)对host_dir进行任何更改,则容器将看到它,反之亦然。


如何将main_folder链接到docker容器中的test_container文件夹?

下面的命令是正确的,除非您在mac上使用boot2docker(取决于将来的更新),否则您可能会发现文件夹为空。有关更正此问题的教程,请参见mattes答案。

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

我需要自动运行,如何做到这一点使用run-d-v命令。

你真的离不开使用这些命令,它们是docker工作方式的内在特征。最好将它们放在shell脚本中,以避免重复编写。

如果boot2docker崩溃会发生什么?docker文件存储在哪里?

如果您设法使用-v arg并引用主机,则文件在主机上是安全的。

如果您使用了“docker build-t myimage”使用Dockerfile,您的文件将被烘焙到图像中。

我相信你的docker映像存储在boot2docker vm中。当我从VirtualBox中删除虚拟机时,我的图像消失了,我发现了这一点。(注意,我不知道Virtualbox是如何工作的,所以图像可能仍然隐藏在其他地方,只是docker看不到)。


2次连续安装:我想这里的许多帖子可能使用了两个boot2docker,你看不到任何东西的原因是你是从boot2dockr装载目录,而不是从主机装载目录。

您基本上需要两次连续装载:

第一个将目录从主机装载到系统第二个将新目录从boot2docker装载到容器,如下所示:

1) 在boot2docker上装载本地系统sudo mount-t vboxsf主机文件夹/boot2dockerfolder2) 在linux容器上装载boot2docker文件docker运行-v/boot2dockerfolder:/root/contenderfolder-i-t imagename

然后,当您进入容器文件夹时,您将看到主机文件夹的内容。


2015年7月更新-boot2docker现在支持直接安装。您可以在Mac提示符下直接使用-v/var/logs/on/host:/var/logs/in/container,而无需双重安装


[更新]截至2017年6月,Docker for Mac解决了其中所有令人讨厌的部分,您必须使用VirtualBox。它允许您使用/private前缀基本上映射本地主机上的所有内容。更多信息请点击此处。[/UPDATE]

目前所有的答案都是关于Boot2docker的。由于现在不赞成使用docker机器,这适用于docker机器:

首先,ssh到docker机器vm中,并创建要映射到的文件夹:

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机器中,并装载刚才共享的文件夹:

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

注意:对于UID和GID,基本上可以使用任何整数,只要它们还没有使用。

这在OS X El Capitan上从docker机器0.4.1和docker 1.8.3开始测试。


我只是在尝试让我的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

也有同样的问题。在docker文档中找到:

注意:主机目录本质上依赖于主机。因此,您不能从Dockerfile装载主机目录,VOLUME指令不支持传递主机目录,因为构建的映像应该是可移植的。主机目录不会在所有潜在主机上都可用。

因此,只有在docker run命令中使用-v参数才能装载读/写主机目录,正如其他答案正确指出的那样。


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标志时,它就完美无瑕了。


我发现,任何位于系统指令下的目录(如/var、/usr、/etc)都不能安装在容器下。

该指令应位于用户的空格处-v开关指示docker守护进程将本地目录装载到容器,例如:

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

这个问题的用户使用的是Docker版本0.9.1,构建867b2a9,我将为您提供Docker版本>=17.06的答案。

您所希望的,保持本地目录在容器目录中同步,是通过使用类型bind装载卷来实现的。这将绑定源(您的系统)和目标(docker容器)目录。这几乎与在linux上安装目录相同。

根据Docker文档,现在适当的mount命令是mount而不是-v。以下是其文档:

--mount:由多个键值对组成,用逗号分隔。每个键/值对采用<key>=<value>元组的形式。--mount语法比-v或--volume更详细,但键的顺序并不重要,标志的值更容易理解。装载的类型,可以是bind、volume或tmpfs。(我们将使用bind)装载源。对于绑定装载,这是Docker守护程序主机上文件或目录的路径。可以指定为source或src。目标将文件或目录装入容器的路径作为其值。可以指定为destination、dst或target。

因此,要使用/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

您还需要处理文件权限,请参阅本文。


我也需要从容器装载主机目录,我使用了volumemount命令。但在测试过程中注意到,它也在容器内创建文件,但经过一些挖掘发现,它们只是符号链接和主机使用的实际文件系统。


从Docker 18-CE开始,您可以使用Docker run-v/src/path:/container/path来进行主机文件夹的双向绑定。

不过,如果您使用的是Windows 10/WSL,并将Docker CE for Windows作为主机,然后在WSL中使用Docker CE客户端工具,那么这里有一个主要的陷阱。WSL知道整个/文件系统,而Windows主机只知道驱动器。在WSL中,您可以使用/mnt/c/projectpath,但是如果您尝试停靠运行-v${PWD}:/projectpath时,您会在主机中发现/projectpath/为空,因为在主机上/mnt意味着什么。

如果您从/c/projectpath工作,然后运行docker-v${PWD}:/projectpath,您会发现在容器中,/projectpath将实时反映/c/projectpath。除了在您的客户机中看到空装载外,没有任何错误或任何其他方法可以检测此问题。

您还必须确保在Docker for Windows设置中“共享驱动器”。


注意,在Windows中,您必须提供绝对路径。

主机:Windows 10容器:Tensorflow笔记本

下面对我有用。

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

我也遇到了同样的问题,我试图在docker上装载C:\Users\folder这是我如何在Docker工具箱命令行中执行的

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

对于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/的本地主机文件夹中看到此新文件。


我也有同样的问题。我的命令行如下所示:

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

问题出在“pwd”上。所以我把它改成了$(pwd):

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

下面是一个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路径复制到剪贴板,按下键盘上的“应用程序键”,它就会将其格式化为Docker喜欢的路径格式。

例如:

将此复制到剪贴板:

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

当光标位于命令行上的所需位置时,按下Apps键,它会将其粘贴在那里:

“/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 

如果主机是windows 10,则使用反斜杠代替正斜杠-

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

确保共享主机驱动器(在本例中为C)。在我的例子中,运行上面的命令后,我收到了请求共享权限的提示。


为了在Windows 10中实现这一点,我必须从系统托盘中打开Docker设置窗口,然后转到共享驱动器部分。

然后,我选中了C旁边的复选框。Docker要求我的桌面凭据以获得写入我的用户文件夹的授权。

然后,我按照上面的示例以及设置页面上的示例运行docker容器,将其附加到容器中的/data。

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

在Mac OS上,要将文件夹/Users/<name>/projects/装载到Mac上的容器根目录:

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

ls/项目


您也可以使用Portiner web应用程序来实现这一点,以获得不同的视觉体验。

首先拉动Portiner图像:

docker pull portainer/portainer

然后为Portiner创建一个卷:

docker volume create portainer_data

还要创建Portiner容器:

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

您将能够使用浏览器访问web应用程序,网址为:“http://localhost:9000“.第一次登录时,系统将提示您设置Portiner管理员凭据。

在web应用程序中,遵循以下菜单和按钮:(容器>添加容器>填充设置>部署容器)

我很难用Portiner创建“装载”卷,我意识到在创建容器卷时必须单击“绑定”。下面是一个卷绑定设置的示例,该设置适用于我的容器创建,其中装载的卷绑定到主机。

备注:我使用Docker 19.035和Portiner 1.23.1


使用命令行:

docker run -it --name <WHATEVER> -p <LOCAL_PORT>:<CONTAINER_PORT> -v <LOCAL_PATH>:<CONTAINER_PATH> -d <IMAGE>:<TAG>

使用docker-compose.yaml:

version: '2'
  services:
    cms:
       image: <IMAGE>:<TAG>
       ports:
       - <LOCAL_PORT>:<CONTAINER_PORT>
       volumes:
       - <LOCAL_PATH>:<CONTAINER_PATH>

假设:

图片:k3_s3标签:最新本地端口:8080容器端口:8080LOCAL_PATH:/要装载的卷容器路径:/mnt

示例:

首先创建要装载的/卷。(如果存在,则跳过)

$ mkdir -p /volume-to-mount

docker compose-f docker-compose.yaml up-d

version: '2'
  services:
    cms:
       image: ghost-cms:latest
       ports:
       - 8080:8080
       volumes:
       - /volume-to-mount:/mnt

验证容器:

docker exec -it CONTAINER_ID ls -la /mnt

对于希望在当前目录中装入文件夹的用户:

docker run -d --name some-container -v ${PWD}/folder:/var/folder ubuntu

从官方网站引用:

确保之前没有运行任何入门容器。从应用程序目录运行以下命令。

x86-64 Mac或Linux设备:码头运行-dp 3000:3000\-w/app-v“$(pwd):/app”\节点:12高山\sh-c“纱线安装和纱线运行开发”Windows(PowerShell):码头运行-dp 3000:3000`-w/app-v“$(pwd):/app”`节点:12高山`sh-c“纱线安装和纱线运行开发”Aple silicon Mac或其他ARM64设备:码头运行-dp 3000:3000\-w/app-v“$(pwd):/app”\节点:12高山\sh-c“apk add--无缓存python2g++make&&yarn install&&yarn run-dev”

解释:

dp 3000:3000-与之前相同。以分离(后台)模式运行并创建端口映射w/app-设置运行命令的“工作目录”或当前目录v“$(pwd):/app”-将当前目录从主机绑定到容器中的/app目录节点:12 alpine-要使用的图像。

注意,这是Dockerfile sh-c“yarn install&&yarn run dev”命令中应用程序的基本映像。

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