Dockerfile优化

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

FROM python:3.8-slim
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]

将多阶段构建与 Alpine 一起用于 Node.js 应用程序

# Build stage
FROM node:14-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

# Runtime stage
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/build ./build
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "build/index.js"]

最小化层数

合并RUN、ENV指令
删除不必要的文件

FROM node:14
RUN apt-get update && \
    apt-get install -y curl && \
    rm -rf /var/lib/apt/lists/* 
WORKDIR /app
COPY package.json .
RUN npm install --production && \
    npm cache clean --force
COPY . .
CMD ["node", "app.js"]

FROM python:3.8
COPY . .
RUN pip install --no-cache-dir -r requirements.txt && \
    rm requirements.txt

ENV JAVA\_HOME=/opt/jdk1.8.0_241 \
    CLASSPATH=.:$JAVA\_HOME/lib:$JAVA\_HOME/jre/lib \
    PATH=$PATH:$JAVA\_HOME/bin

利用 Docker 忽略文件

Node.js应用程序的示例 .dockerignore 文件

node_modules
npm-debug.log
.DS_Store
.env
.git
.gitignore
README.md
LICENSE
docker-compose.yml
Dockerfile
tests/

.dockerignore 集成到 Python 项目中

*.pyc
*.pyo
*.pyd
__pycache__
.env
.git
.gitignore
README.md
Dockerfile
tests/

优化软件安装

FROM ubuntu:latest
RUN apt-get update && \
    apt-get install -y curl git vim && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

FROM python:3.8-slim
RUN pip install --no-cache-dir flask gunicorn && \
    find / -type d -name __pycache__ -prune -exec rm -rf {} \;

设置时区

FROM alpine:3.11.5
ENV TZ=Asia/Shanghai
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

设置系统语言

FROM alpine:3.11.5
ENV LANG=en_US.UTF-8 \
    LANGUAGE=en_US.UTF-8
    
RUN apk --no-cache add ca-certificates \ 
    && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \ 
    && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk \ 
    && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk \
    && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk \
    && apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
    && rm -rf /usr/lib/jvm glibc-2.29-r0.apk glibc-bin-2.29-r0.apk  glibc-i18n-2.29-r0.apk \
    && /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true \
    && echo "export LANG=$LANG" > /etc/profile.d/locale.sh \
    && apk del glibc-i18n

尽可能使用静态二进制文件

FROM golang:1.16 AS builder
WORKDIR /build
COPY . .
RUN CGO\_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .

FROM scratch
COPY --from=builder /build/myapp /myapp
CMD ["/myapp"]

使用 BuildKit 压缩镜像层

启用 BuildKit
BuildKit包含在 Docker18.09 及更高版本中,但默认情况下不启用。通过设置 DOCKER_BUILDKIT 环境变量来启用

export DOCKER\_BUILDKIT=1
docker build .

或者将 Docker 守护程序配置为默认使用 BuildKit

{ "features": { "buildkit": true } }

使用 BuildKit 优化映像构建

FROM node:14
WORKDIR /app
COPY package.json package-lock.json ./
RUN --mount=type=cache,target=/root/.npm npm ci
COPY . .

挤压镜像层

使用 docker export 和 docker import

docker build -t my-app .
docker container create --name temp-container my-app
docker export temp-container | docker import - my-app:squashed
docker container rm temp-container

使用 Docker Squash 工具

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值