Docker和Volumes nocopy

时间:2016-07-10 00:04:13

标签: docker volume mount

我想从我的主机到Docker容器挂载一个目录,我想在容器内做一些修改。但是,当我修改安装点上的内容时,更改也会反映在主机上。

例如:

$ docker run -d --name webserver01 -v /home/guest/app:/app

之后我在/ app

中的容器内做了一些更改
$ docker exec -ti webserver01 'touch /app/test.txt'

文件test.txt在我的主机和容器内创建(想法是只在容器内创建文件)

我尝试使用标记nocopy,但我有这个错误:

$ docker run -d --name webserver01 -v /home/guest/app:/app:nocopy
docker: Error response from daemon: Invalid bind mount spec "/home/guest/app:/app:nocopy": invalid mode: nocopy.

Docker版本

$ docker --version
Docker version 1.11.1, build 5604cbe/1.11.1

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以通过某种方式隐藏文件,但是使用Docker卷时您所描述的内容是不可能的,因为容器上的目录是主机上目录的安装而不是正在复制的文件。

nocopy修饰符适用于创建卷并且数据已存在于容器的路径中时,您可以指定是否希望在创建卷时复制该数据。

您可能需要设计卷结构,以便您创建的文件不在共享卷上。

答案 1 :(得分:1)

我知道这是一个老问题,但这可能会对人们有所帮助。

如果您想反映从主机到容器的修改,而不是相反,那将很难。

如果要获取代码的“快照”,则在构建映像时可以使用COPY或ADD将代码获取到容器内,这意味着您的代码必须位于构建上下文中。例如:

.
├── content_to_mount
|   ├── stuff1.txt
|   └── stuff2.txt
├── docker_stuff
|   ├── docker.conf
|   └── Dockerfile
└── other_stuff

如果具有这种文件树,则需要在根目录(可以在其中看到docker_stuff)中使用以下命令来构建docker映像:

docker build -f docker_stuff/Dockerfile .

在您的Dockerfile中,您将具有类似以下内容:

COPY content_to_mount app

如果您的应用程序代码确实在您的家中,则可能是“危险的”,因为您的Docker构建不应有太大的上下文。

另一种解决方案,但是在此过程中有点奇怪,那就是像这样挂载东西:

$ docker run -d --name webserver01 -v /home/guest/app:/ref/app

,并且在您的容器中有一个特定的入口点,可以执行:

cp -R /ref/app /app

然后,您将在/ref/app中拥有从主机装载的参考代码,而在/app中运行的修改将不会反映在主机上。