假设我有一个Docker容器和一个文件夹在我的主机/hostFolder。现在,如果我想将这个文件夹作为卷添加到Docker容器中,那么我可以通过在Dockerfile中使用add或将其作为卷挂载来做到这一点。
到目前为止,一切顺利。
现在/hostFolder包含一个子文件夹/hostFolder/subFolder。
我想把/hostFolder挂载到Docker容器中(无论是读写还是只读都不重要,对我来说都适用),但我不想把它包括在/hostFolder/subFolder中。我想排除这个,我还希望Docker容器能够对这个子文件夹进行更改,而不需要在主机上更改它。
这可能吗?如果有,怎么做?
First, using the ADD instruction in a Dockerfile is very different from using a volume (either via the -v argument to docker run or the VOLUME instruction in a Dockerfile). The ADD and COPY commands just take a copy of the files at the time docker build is run. These files are not updated until a fresh image is created with the docker build command. By contrast, using a volume is essentially saying "this directory should not be stored in the container image; instead use a directory on the host"; whenever a file inside a volume is changed, both the host and container will see it immediately.
我不相信您可以使用卷来实现您想要的效果,如果您想这样做,您必须重新考虑您的目录结构。
但是,使用COPY(应该优先使用ADD)实现它非常简单。您可以使用.dockerignore文件来排除子目录,或者您可以复制所有文件,然后执行RUN rm bla来删除子目录。
记住,你使用COPY或add添加到image的任何文件必须在build上下文中,即在你运行docker build的目录中或下面。
对于那些试图在node_modules不被local覆盖的地方获得一个良好的工作流的人来说,这可能会有所帮助。
更改docker-compose,将匿名持久卷挂载到node_modules,以防止本地覆盖它。在这篇文章中已经概述了几次。
services:
server:
build: .
volumes:
- .:/app
- /app/node_modules
这是我们忽略的重要部分。当旋转堆栈时,使用docker-compose -V。如果没有这一点,如果您添加了一个新包并重新构建映像,那么它将使用初始docker-compose启动时的node_modules。
-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving
data from the previous containers.
First, using the ADD instruction in a Dockerfile is very different from using a volume (either via the -v argument to docker run or the VOLUME instruction in a Dockerfile). The ADD and COPY commands just take a copy of the files at the time docker build is run. These files are not updated until a fresh image is created with the docker build command. By contrast, using a volume is essentially saying "this directory should not be stored in the container image; instead use a directory on the host"; whenever a file inside a volume is changed, both the host and container will see it immediately.
我不相信您可以使用卷来实现您想要的效果,如果您想这样做,您必须重新考虑您的目录结构。
但是,使用COPY(应该优先使用ADD)实现它非常简单。您可以使用.dockerignore文件来排除子目录,或者您可以复制所有文件,然后执行RUN rm bla来删除子目录。
记住,你使用COPY或add添加到image的任何文件必须在build上下文中,即在你运行docker build的目录中或下面。