我正在尝试将主机目录装载到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
如何将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看不到)。
这个问题的用户使用的是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
您还需要处理文件权限,请参阅本文。
从官方网站引用:
确保之前没有运行任何入门容器。从应用程序目录运行以下命令。
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。