我必须创建一个将MyApp目录复制到映像中的docker文件。
MyApp
-libs
-classes
-resources
Libs目录大约有50 MB,并且不经常更改Classes目录大约1 MB的位置,并且它经常发生变化。为了优化docker构建,我计划在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镜像中。我的目标是编写像这样的docker文件
ADD MyApp/libs /opt/MyApp/libs
## do other operations
ADD MyApp -exclude MyApp/libs /opt/MyApp
是否有类似的命令可以排除复制到docker镜像的目录中的某些文件?
答案 0 :(得分:2)
我考虑了@nwinkler解释的方法,并添加了一些步骤来使构建保持一致。
现在我的上下文目录结构如下
-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目录没有风险。
答案 1 :(得分:1)
当前版本的Docker无法开箱即用。使用.dockerignore
文件也不起作用,因为它始终会排除libs
文件夹。
您可以做的是将docker build
包装在shell脚本中并将MyApp
文件夹(减去libs
文件夹)和libs
文件夹复制到临时目录中在致电docker build
之前。
这样的事情:
#!/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 ...
然后,您可以将Dockerfile
更改为temp
目录中的副本:
ADD temp/libs /opt/MyApp/libs
## do other operations
ADD temp/MyApp /opt/MyApp
第二个ADD
命令可能会从图像中删除/opt/MyApp/libs
文件夹。如果发生这种情况,您可能必须撤消ADD
命令并在其他所有内容后添加libs
文件夹。