备忘:Dockerfile编写要点

1. 选择基础构建镜像

1.1 使用空镜像scratch

顾名思义,就是完全空壳,什么环境都没有,什么系统都没有,全部都得自己安装

1.2 使用专用镜像Alpine

Alpine 是一个高度精简又包含了基本工具的轻量级 Linux 发行版,基础镜像只有 4.41M,各开发语言和框架都有基于 Alpine 制作的基础镜像,但是太精简,可能出现一些奇怪的环境问题

1.3 使用工具镜像busybox

如果希望镜像里可以包含一些常用的 Linux 工具,busybox 镜像是个不错选择,镜像本身只有 1.16M,非常便于构建小镜像。

1.4 使用基础系统镜像

Debian和CentOS都是基于Linux内核的流行开源操作系统。虽然它们有一些相似之处,但它们之间也存在一些关键差异:

  • 软件包管理:Debian使用apt软件包管理器,而CentOS使用yum或dnf软件包管理器。两个包管理器都能够安装、更新和删除软件包,但它们的命令和语法有所不同。

  • 发布周期:Debian的发布周期比CentOS慢。Debian平均每两年发布一个新版本,而CentOS则更频繁地发布新版本,通常每隔几年发布一次。

  • 默认软件:Debian和CentOS预装的默认软件包不同。Debian倾向于更精简的安装,重点是提供一个稳定的基础系统,而CentOS则包含更多预安装的软件包,适用于更广泛的用例。

  • 社区:Debian由志愿者社区管理,而CentOS由一个商业公司(Red Hat)支持,并拥有更大的公司支持网络。

  • 系统架构:Debian支持比CentOS更广泛的硬件架构,而CentOS主要设计用于x86和x86-64处理器。

1.5 尽量串联RUN指令

在定义 Dockerfile 时,如果太多的使用 RUN 指令,经常会导致镜像有特别多的层,镜像很臃肿,而且甚至会碰到超出最大层数(127层)限制的问题,遵循 Dockerfile 最佳实践,我们应该把多个命令串联合并为一个 RUN(通过运算符&&来实现),每一个 RUN 要精心设计,确保安装构建最后进行清理,这样才可以降低镜像体积,以及最大化的利用构建缓存。

RUN apt-get update && apt-get install wget && cd /

1.6 使用多阶段构建(如有需要)

Dockerfile 中每条指令都会为镜像增加一个镜像层,并且你需要在移动到下一个镜像层之前清理不需要的组件。实际上,有一个 Dockerfile 用于开发(其中包含构建应用程序所需的所有内容)以及一个用于生产的瘦客户端,它只包含你的应用程序以及运行它所需的内容。这被称为“建造者模式”。Docker 17.05.0-ce 版本以后支持多阶段构建。使用多阶段构建,你可以在 Dockerfile 中使用多个 FROM 语句,每条 FROM 指令可以使用不同的基础镜像,这样您可以选择性地将服务组件从一个阶段 COPY 到另一个阶段,在最终镜像中只保留需要的内容。

1.7 可将时区设置为东八区并安装bash

# 将时区设置为东八区并安装bash
RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
    && apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \
    && echo Asia/Shanghai > /etc/timezone \
    && apk del tzdata \
    && apk update \
    && apk upgrade \
    && apk add --no-cache bash \
    bash-doc \
    bash-completion \
    && rm -rf /var/cache/apk/*

1.8 可将时区设置为东八区

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo Asia/Shanghai > /etc/timezone

1.9 (nodejs项目)下载工具node-prune,清理node_modules

# 下载工具node-prune,清理node_modules的
RUN wget https://gobinaries.com/tj/node-prune && chmod +x node-prune && ./node-prune
# run node prune
RUN node-prune

1.10 (nodejs项目)使用npm清除开发测试等包

# 使用npm清除开发测试等包
RUN npm prune --production

1.11 RUN命令中执行apt、apk或者yum类工具技巧

如果在 RUN 命令中执行 apt、apk 或者 yum 类工具,可以借助这些工具提供的一些小技巧来减少镜像层数量及镜像大小。举几个例子:

(1)在执行 apt-get install -y 时增加选项--no-install-recommends ,可以不用安装建议性(非必须)的依赖,也可以在执行 apk add 时添加选项--no-cache 达到同样效果;

(2)执行 yum install -y 时候, 可以同时安装多个工具,比如 yum install -y gcc gcc-c++ make。将所有 yum install 任务放在一条 RUN 命令上执行,从而减少镜像层的数量;

(3)组件的安装和清理要串联在一条指令里面,如 apk --update add php7 && rm -rf /var/cache/apk/* ,因为 Dockerfile的每条指令都会产生一个文件层,如果将 apk add … 和 rm -rf … 命令分开,清理无法减小apk命令产生的文件层的大小。 Ubuntu或 Debian可以使用 rm -rf /var/lib/apt/lists/* 清理镜像中缓存文件;CentOS 等系统使用 yum clean all 命令清理。

2. 根据tag标签选购现成镜像

2.1 Alpine,slim后缀

一般现成的一些开发环境镜像,比如nodejs,python等,都会出现后缀带有Alpine,slim 等字眼,比如node:20.0.0-alpine,node:20.0-slim,alpine意思是最精简的版本了,如果要带一些现成工具,推荐使用slim

2.2 buster,stretch ,jessie,bullseye,bookworm后缀

代表不同的 bebian 版本号

  • buster - debian 10
  • stretch - debian 9
  • jessie - debian 8
  • bullseye、bookworm - 正在开发但尚未稳定版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值