我有一个很大的tar /可执行文件(超过30GB)我COPY/ADD
但它只用于安装。安装应用程序后,我不再需要它了。
我该怎么办?我试图使用它但是:
每次运行构建时,都需要几分钟来定义构建上下文。
我想分享这张图片,如果我用docker save
创建一个tar,最终版本或每个图层都包含在其中吗?
我发现一些解决方案说我可以使用RUN wget tar ... && rm tar
,但我不想为此创建网络服务器。
为什么在构建过程中无法安装卷?!这将非常有用。
答案 0 :(得分:2)
使用Docker的多阶段构建。此机制允许您删除中间工件,从而实现轻量级图像。
示例:
FROM alpine:latest as build
# copy large file
# build
FROM alpine:latest as output
# copy necessary files built in the previous stage
COPY --from=build app /app
build
阶段内置的任何内容都不会包含在最终图片中,除非您明确COPY
。
文档:https://docs.docker.com/develop/develop-images/multistage-build/
答案 1 :(得分:1)
这可以使用2个不同的上下文来解决。
请按照以下步骤操作。 目标是创建一个
为此,您必须创建2个文件夹(Build& CodeBase),如下所示。
Application<br/>
|---> BUILD <br/>
|======|--->Large-File<br/>
|======|--->Dockerfile<br/>
|--->CodeBase<br/>
|======|--->SRC+Other stuff<br/>
|======|--->Dockerfile<br/>
建设与发展代码库这两个文件夹都有单独的Dockerfile并相应地排列文件。
Dockerfile(生成)
FROM **Base-Image**
COPY Large-File /tmp/Large-File
构建它并使用某些名称标记它(如base-build-app-image)
#>cd Application <==Application root folder as mentioned above==>
#>docker build -t base-build-app-image BUILD <==path of your build-folder==>
Dockerfile(基本代码)
FROM base-build-app-image
RUN *****
CMD *****
RUN rm -f **/tmp/Large-File**
RUN rm -f **Remove installation files that is not required**
ENTRYPOINT *****
构建此代码库并且base-build-app-image已经在您的本地docker-repository中,并且您的大型iso文件不在current-buid-context中
#>cd Application <==Application root folder as mentioned above==>
#>docker build CodeBase <==path of your code-base==>
这一次,因为上下文大小只是你的代码库,因为这不包括大文件 - 它肯定会缩短你的构建时间。
您还可以预先使用docker-compose同时执行这两项操作,这样您就不必执行2个单独的命令。
如果您在准备这个docker-compose文件时需要帮助,请在评论中告诉我 如果有任何不清楚的地方,请发表评论或通过聊天来解决此问题。