我引用了类似的question,但是按照此方法,将父目录中的所有文件都添加到了构建上下文中,以我为例,它的大小超过了8GB。所以问题是如何从父目录复制文件而不添加文件以构建上下文
项目的结构是
Project
|
|--docker-files
| |
| |-Dockerfile
|
|--Folder
| |
| |--file/to/be/copied
|
|--other files
使用-f标志,命令是在项目目录中执行的docker build -f docker-files/Dockerfile . -t name
解决方案之一是包括.dockerignore文件,但它非常混乱,将docker文件放在子文件夹中的全部目的是减小构建上下文的大小。
答案 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擅长维护的结构。