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



我是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/*

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

可以执行多阶段生成,并从上一个映像复制新映像上的项目。还要安装任何必需的运行时依赖项(如果有(。

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/

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

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

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

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

请注意,在实验性 Docker 功能中压缩,并且必须在 Docker 配置中启用。

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

  • 码头工人镜像构建参考
  • 新的 Docker 壁球选项如何工作?

相关内容

  • 没有找到相关文章

最新更新