在跳过给定子目录时将目录复制到docker镜像

时间:2017-01-09 05:51:23

标签: docker dockerfile

我必须创建一个将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镜像的目录中的某些文件?

2 个答案:

答案 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文件夹。

相关问题