如何仅使用大文件来构建容器而不添加它?

时间:2018-04-20 06:01:22

标签: docker

我有一个很大的tar /可执行文件(超过30GB)我COPY/ADD但它只用于安装。安装应用程序后,我不再需要它了。

我该怎么办?我试图使用它但是:

  • 每次运行构建时,都需要几分钟来定义构建上下文。

  • 我想分享这张图片,如果我用docker save创建一个tar,最终版本或每个图层都包含在其中吗?

我发现一些解决方案说我可以使用RUN wget tar ... && rm tar,但我不想为此创建网络服务器。

为什么在构建过程中无法安装卷?!这将非常有用。

2 个答案:

答案 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个不同的上下文来解决。

请按照以下步骤操作。 目标是创建一个

  1. docker image,它将为您提供大型构建文件。
  2. docker image,它将为您提供真正的代码库/可执行文件。
  3. 为此,您必须创建2个文件夹(Build&amp; 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文件时需要帮助,请在评论中告诉我 如果有任何不清楚的地方,请发表评论或通过聊天来解决此问题。