我想将主机上的目录挂载到 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 卷,您所描述的情况是不可能的,因为容器上的目录是主机上目录的挂载,而不是正在复制的文件。
nocopy
修饰符适用于当您创建卷并且数据已存在于容器路径中时,您可以指定是否希望在创建卷时复制该数据。
您可能需要设计一个卷结构,以便您创建的文件不在共享卷上。
我知道这是一个老问题,但它可能会对人们有所帮助。
如果你想将主机的修改反映到容器,而不是相反,那就很难了。
如果您想获得代码的“快照”,您可以在构建镜像时使用 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
中运行的修改不会反映在主机上。
我有一个问题。如果我不对 nfs 卷使用 nocopy,容器将覆盖现有数据。或者仅在所需文件不存在时才复制。我了解 nocopy 会阻止容器在创建时将文件复制到卷。但是如果我开始一项新服务并且需要默认配置文件。前任。皮孔。 nocopy 不需要关闭。我真的只需要知道现有数据是否会被覆盖。