【问题标题】:Dockerfile build remove source code from final imageDockerfile 构建从最终图像中删除源代码
【发布时间】:2019-12-30 07:11:46
【问题描述】:

我是 Docker 新手。我想通过使用 make 命令构建一个 c++ 库来构建一个 docker 映像。我在 Dockerfile 中的做法是这样的

  • 从主机复制源代码
  • 安装所需的软件包
  • 运行制作
  • 将库 (.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/*

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

【问题讨论】:

  • 您可以使用多阶段构建并仅将所需内容从一个映像复制到另一个映像

标签: docker makefile dockerfile alpine


【解决方案1】:

您可以进行多阶段构建并将工件从前一个图像复制到新图像上。还要安装任何必需的运行时依赖项(如果有)。

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/

【讨论】:

  • 但是使用“make install”,可能会有很多工件散布在各处。
  • 我找到了解决方案。使用DESTDIRstowrsync,可以安全地收集和安装工件。例如:DESTDIR=/usr/local/stow/xxx ninja install,然后是cd usr/local/stow &amp;&amp; stow xxx。我相信makecmake 也支持DESTDIR。
【解决方案2】:

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

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

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

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

请注意,压缩是一个实验性 Docker 功能,并且必须是 enabled in Docker configuration

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

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 2019-04-30
    • 2016-03-11
    • 1970-01-01
    • 2015-09-27
    • 2013-06-01
    • 2012-12-11
    • 2015-08-20
    相关资源
    最近更新 更多