制作尽可能小的容器镜像
docker 制作尽可能小的镜像
基础镜像选择
-
alpine镜像(非绝对)
FROM alpine:3.22.1
-
可能受影响的问题
- 如果需要用到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
最小化依赖关系
-
从镜像中删除不必要的依赖和文件
FROM alpine:3.22.1 RUN apk --no-cache del .build-deps
忽略文件的".dockerignore"
可以在dockerfile文件目录下,创建一个隐藏文件".dockerignore",用来排除不需要拷贝到镜像中的文件。
-
.dockerignore 内容举例:
node_modules .git
-
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/*
本文来自博客园,作者:ヾ(o◕∀◕)ノヾ,转载请注明原文链接:https://www.cnblogs.com/Jupiter-blog/p/19134986