我是Docker的新手。我想通过使用make命令构建c ++库来构建docker映像。我在Dockerfile中执行此操作的方式就是
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/*
我只想最小化最终图像尺寸。是我这样做的正确方法,还是有更好的方法?请帮忙。
答案 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
的更多详细信息,请参见: