将目录复制到泊坞窗图像中,同时跳过给定的子目录
我必须创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 ...
然后你可以改变你的Dockerfile
从temp
目录复制:
ADD temp/libs /opt/MyApp/libs ## do other operations ADD temp/MyApp /opt/MyApp
第二个ADD
命令会从图像中删除/opt/MyApp/libs
文件夹。 如果发生这种情况,则可能需要将ADD
命令反转,并在其他所有操作之后添加libs
文件夹。