在Docker中将文件复制到构建上下文之外而不增加构建上下文的大小?

时间:2019-06-25 04:52:08

标签: docker

我引用了类似的question,但是按照此方法,将父目录中的所有文件都添加到了构建上下文中,以我为例,它的大小超过了8GB。所以问题是如何从父目录复制文件而不添加文件以构建上下文

项目的结构是

Project
|
|--docker-files
|   |
|   |-Dockerfile
|
|--Folder
|   |
|   |--file/to/be/copied
|
|--other files

使用-f标志,命令是在项目目录中执行的docker build -f docker-files/Dockerfile . -t name

解决方案之一是包括.dockerignore文件,但它非常混乱,将docker文件放在子文件夹中的全部目的是减小构建上下文的大小。

2 个答案:

答案 0 :(得分:1)

file/to/be/copied仅位于Folder中,因此您只需要将此文件夹设置为构建上下文,就像下一个:

docker build -f docker-files/Dockerfile -t abc:1 Folder

已更新:

如您在评论中所述:

  

我不想使用.dockerignore文件,因为文件夹,子文件夹中有很多文件需要忽略。无论如何,谢谢您的解决– Kitwradr

如果要忽略的事情很多,只需添加一个文件,就可以使用!

.dockerignore

*
!file/to/be/copied

它将首先排除文件夹中的所有内容,然后为file/to/be/copied赋予一个例外。

答案 1 :(得分:1)

如果您不能使用.dockerignore,而必须使用您所描述的目录树,则一种方法是在docker build之前在本地系统上创建备用Docker构建上下文树。

内部,docker build的工作方式是创建上下文目录的tar文件,通过Unix套接字通过HTTP将其发送到Docker守护程序,然后将其解压缩。即使$DOCKER_HOST指向VM或其他系统,此方法也有效,但这意味着Docker拒绝告诉自己实际构建上下文的来源。将树从主机复制到Docker守护程序是很慢的部分(即使在纯本地系统上也是如此)。

因此您可以执行以下操作:

rm -rf docker-build
mkdir docker-build
cp docker-files/Dockerfile docker-build
cp -a Folder docker-build
docker build -t ... docker-build

您没有明确cp输入的内容都不会出现在构建上下文中。

如果出于某种原因您希望在Docker之外执行部分构建序列,则此方法也相当有效(例如,重用非常好的非Docker构建序列并将结果打包)。如果您另外使用Make,这也是Makefile擅长维护的结构。