将目录复制到泊坞窗图像中,同时跳过给定的子目录

我必须创build一个docker文件,将MyApp目录复制到图像中。

MyApp -libs -classes -resources 

Libs目录大约有50 MB,并且不经常更改,因为Classes目录大约是1 MB,并且经常发生更改。 为了优化Docker构build,我计划在Dockerfile的开头添加Libs目录,并在Dockerfile的末尾添加其他目录。 我目前的做法是这样的

 ADD MyApp/libs /opt/MyApp/libs ## do other operations ADD MyApp/classes /opt/MyApp/resources ADD MyApp/classes /opt/MyApp/classes 

这不是可维护的格式,因为将来我可能会将MyApp目录中的其他目录复制到泊坞窗图像中。 我的目标是写这样的docker文件

 ADD MyApp/libs /opt/MyApp/libs ## do other operations ADD MyApp -exclude MyApp/libs /opt/MyApp 

是否有类似的命令来排除复制到泊坞窗镜像的目录中的一些文件?

我考虑了由@nwinkler解释的方法,并添加了几个步骤使构build一致。

现在我的上下文目录结构如下

 -Dockerfile -MyApp -libs -classes -resources -.dockerignore -libs 

我将libs目录复制到MyApp目录的外部。 添加了包含以下行的.dockerignore文件

 MyApp/libs/* 

像这样更新了Dockerfile

 ADD libs /opt/MyApp/libs ## do other operations ADD MyApp /opt/MyApp 

由于dockerignore文件忽略了MyApp / lib目录,因此覆盖之前复制的libs目录没有任何风险。

对于当前版本的Docker来说,这是不可能的。 使用.dockerignore文件也将不起作用,因为它总是会排除libs文件夹。

你可以做的是将docker build包装在shell脚本中,并在调用docker build之前将MyApp文件夹(不包括libs文件夹)和libs文件夹复制到临时目录中。

像这样的东西:

 #!/usr/bin/env bash rm -rf temp mkdir -p temp # Copy the whole folder cp -r MyApp temp # Move the libs folder up one level mv temp/MyApp/libs temp # Now build the Docker image docker build ... 

然后你可以改变你的Dockerfiletemp目录复制:

 ADD temp/libs /opt/MyApp/libs ## do other operations ADD temp/MyApp /opt/MyApp 

第二个ADD命令会从图像中删除/opt/MyApp/libs文件夹。 如果发生这种情况,则可能需要将ADD命令反转,并在其他所有操作之后添加libs文件夹。