Docker 和 Volumes nocopy

问题描述 投票:0回答:3

我想将主机上的目录挂载到 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

感谢您的帮助!

docker volume mount
3个回答
4
投票

可能有某种方法可以隐藏该文件,但对于 Docker 卷,您所描述的情况是不可能的,因为容器上的目录是主机上目录的挂载,而不是正在复制的文件。

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

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


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
中运行的修改不会反映在主机上。


0
投票

我有一个问题。如果我不对 nfs 卷使用 nocopy,容器将覆盖现有数据。或者仅在所需文件不存在时才复制。我了解 nocopy 会阻止容器在创建时将文件复制到卷。但是如果我开始一项新服务并且需要默认配置文件。前任。皮孔。 nocopy 不需要关闭。我真的只需要知道现有数据是否会被覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.