假设我的主机/hostFolder
上有一个Docker容器和一个文件夹。现在,如果我想将此文件夹作为卷添加到Docker容器中,那么我可以使用ADD
中的Dockerfile
或将其作为卷安装。
到目前为止,非常好。
现在/hostFolder
包含一个子文件夹/hostFolder/subFolder
。
我想将/hostFolder
挂载到Docker容器中(无论是读写还是只读都无关紧要,对我而言都适用),但我 NOT 想要拥有它包括/hostFolder/subFolder
。我想排除这个,我也希望Docker容器能够对这个子文件夹进行更改,而不会在主机上更改它。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:245)
使用docker-compose我可以在本地使用node_modules,但在docker容器中使用docker-compose.yml
volumes:
- './angularApp:/opt/app'
- /opt/app/node_modules/
所以./angularApp
中的所有内容都映射到/opt/app
然后我创建了另一个挂载卷/opt/app/node_modules/
,它现在是空目录 - 即使在我的本地计算机./angularApp/node_modules
中也不是空。
答案 1 :(得分:98)
如果您希望docker-compose忽略子目录但持久化,则可以在docker-compose.yml
中执行以下操作:
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules
这会将当前目录挂载为共享卷,但会挂载持久性docker卷来代替本地node_modules
目录。这类似于@kernix的答案,但是这将允许node_modules
在docker-compose up
次运行之间保持,这可能是期望的行为。
答案 2 :(得分:14)
要排除文件,请使用以下
volumes:
- /hostFolder:/folder
- /dev/null:/folder/fileToBeExcluded
答案 3 :(得分:13)
首先,使用Dockerfile中的ADD
指令非常与使用卷不同(通过-v
参数docker run
或{{ 1}} Dockerfile中的指令)。 VOLUME
和ADD
命令只会在运行COPY
时获取文件的副本。在使用docker build
命令创建新图像之前,不会更新这些文件。相比之下,使用卷实质上是说“此目录不应存储在容器映像中;而是使用主机上的目录”;无论何时更改卷内的文件,主机和容器都会立即看到它。
我不相信你可以使用卷来实现你想要的东西,如果你想这样做,你将不得不重新考虑你的目录结构。
然而,使用docker build
(应优先于COPY
)实现起来非常简单。您可以使用ADD
文件排除子目录,也可以.dockerignore
所有文件然后执行COPY
删除子目录。
请注意,您使用RUN rm bla
或COPY
添加到图片的所有文件都必须位于构建上下文中,即在您运行ADD
目录的内部或下方。
答案 4 :(得分:8)
对于那些试图使工作流变得不错的地方,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.
答案 5 :(得分:1)
看起来旧的解决方案不再起作用了(至少对我而言)。 创建一个空文件夹并将目标文件夹映射到它很有帮助。
volumes:
- ./angularApp:/opt/app
- .empty:/opt/app/node_modules/
答案 6 :(得分:0)
使用docker命令行:
docker run \
--mount type=bind,src=/hostFolder,dst=/containerFolder \
--mount type=volume,dst=/containerFolder/subFolder \
...other-args...
也可以使用-v
选项(记入Bogdan Mart),但是--mount
更清晰,recommended。
答案 7 :(得分:0)
对于还有问题的人,node_modules文件夹仍然会从本地系统覆盖,反之亦然
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules/
这是解决方案,将node_modules后面的/
作为后缀。
答案 8 :(得分:0)
要排除计算机卷中包含的已装入文件,您必须通过将卷分配给该文件来覆盖它。 在您的配置文件中:
services:
server:
build : ./Dockerfile
volumes:
- .:/app
您的dockerfile中的示例:
# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file