Dockerfile构建从最终映像中删除源代码

时间:2019-08-28 15:38:05

标签: docker makefile dockerfile alpine

我是Docker的新手。我想通过使用make命令构建c ++库来构建docker映像。我在Dockerfile中执行此操作的方式就是

  • 从主机复制源代码
  • 安装必需的软件包
  • 运行make
  • 将库(.so)复制到图像内的其他文件夹中
  • 删除源代码

Dockerfile代码写在下面。

我面临的问题是,即使删除了源代码,最终的图像大小仍然很大。

由于Dockerfile的每一行都创建了一个不同的层,因此有一种方法可以使用curl或wget下载源代码,然后在同一层中删除源代码。但是我不喜欢这种解决方案。

FROM alpine

RUN apk update && apk add <required_packages>

COPY source_code /tmp/source_code

RUN make -C /tmp/source_code && \
        mkdir /libraries/
        cp /tmp/lib/* /libraries/
        rm -rf /tmp/*

我只想最小化最终图像尺寸。是我这样做的正确方法,还是有更好的方法?请帮忙。

2 个答案:

答案 0 :(得分:2)

您可以进行多阶段构建,然后将工件复制到前一张图像上的新图像上。还安装所有必需的运行时依赖项(如果有)。

FROM alpine AS builder

RUN apk add --no-cache <build_dependencies>

COPY source_code /tmp/source_code

RUN make -C /tmp/source_code && \
        mkdir /libraries/
        cp /tmp/lib/* /libraries/
        rm -rf /tmp/*

FROM alpine

RUN apk add --no-cache <runtime_dependencies>

COPY --from=builder /libraries/ /libraries/

答案 1 :(得分:2)

除了使用多阶段Docker构建之外,另一种用于压缩生成的映像的方法是使用--squash构建选项。图像构建命令行示例:

docker image build --squash -t your-image .

删除Docker映像中的文件时,文件本身并没有真正消失,而是保留在以前的Docker文件系统层中,因此它们仍然占用空间。

压扁会使图像的所有文件系统层折叠,因此用rm删除的文件将从生成的单个层中删除。这是从图像中删除源代码并对其进行压缩的有效方法。

请注意,要挤压实验性的Docker功能,必须为enabled in Docker configuration

有关docker build --squash的更多详细信息,请参见: