制作尽可能小的容器镜像

docker 制作尽可能小的镜像

基础镜像选择

  1. alpine镜像(非绝对)

    FROM alpine:3.22.1
    
  2. 可能受影响的问题

  • 如果需要用到glibc, alpine镜像可能不好用

多阶段构建

在前置阶段中编译或构建应用程序,或执行其他复杂过程。将该阶段中的最终成果直接复制到后置较小阶段中。

FROM --platform=$BUILDPLATFORM alpine:3.22.1 AS downloader

ARG TARGETARCH

RUN apk add --no-cache curl

RUN case "${TARGETARCH}" in \
        amd64) ARCH="amd64" ;; \
        arm64) ARCH="arm64" ;; \
        *) exit 1 ;; \
    esac && \
    curl -L "https://dl.min.io/client/mc/release/linux-${ARCH}/mc" -o /mc

FROM alpine:3.22.1

COPY --from=downloader /mc /usr/local/bin/mc

RUN chmod +x /usr/local/bin/mc

最小化依赖关系

  1. 从镜像中删除不必要的依赖和文件

    FROM alpine:3.22.1
    RUN apk --no-cache del .build-deps
    

忽略文件的".dockerignore"

可以在dockerfile文件目录下,创建一个隐藏文件".dockerignore",用来排除不需要拷贝到镜像中的文件。

  1. .dockerignore 内容举例:

    node_modules
    .git
    
  2. dockerfile 内容举例:

    例如将当前目录直接拷贝到/opt目录下,此时.dockerignore文件就可以帮我们排除一些不需要拷贝的文件。

    FROM alpine:3.22.1
    COPY . /opt/
    

文件压缩

将要拷贝的文件压缩后,再拷贝进镜像进行解压缩。

FROM --platform=$BUILDPLATFORM alpine:3.22.1 AS downloader

ARG TARGETARCH

RUN apk add --no-cache curl

RUN case "${TARGETARCH}" in \
        amd64) ARCH="amd64" ;; \
        arm64) ARCH="arm64" ;; \
        *) exit 1 ;; \
    esac && \
    curl -L "https://dl.min.io/client/mc/release/linux-${ARCH}/mc" -o /mc && \
    tar zcf /mc.tar.gz /mc

FROM alpine:3.22.1

COPY --from=downloader /mc.tar.gz /tmp/mc.tar.gz

RUN tar zxf /tmp/mc.tar.gz -C /usr/local/bin/ && \
    chmod +x /usr/local/bin/mc

合并指令

用符号 && 将shell命令进行拼接

# 推荐
RUN apk --no-cache add curl && \
    curl -L "https://dl.min.io/client/mc/release/linux-${ARCH}/mc" -o /mc

# 不推荐做法
RUN apk --no-cache add curl
RUN curl -L "https://dl.min.io/client/mc/release/linux-${ARCH}/mc" -o /mc

清理缓存

清理目录

  • /var/cache/apk
  • /tmp
FROM alpine:3.22.1
RUN rm -rf /var/cache/apk/* /tmp/*
posted @ 2025-10-11 14:32  ヾ(o◕∀◕)ノヾ  阅读(4)  评论(0)    收藏  举报