docker第八期 dockerfile的编写原则

前言

有一套好的编写规范可以使得协作者,更加清晰的了解镜像的完整构建流程,还可以减少镜像的体积,加快镜像构建的速度和分发速度。

单一职责

由于容器的本质是进程,一个容器代表一个进程,因此不同功能的应用应该尽量拆分为不同的容器,每个容器只负责单一业务进程。

提供注释信息

Dockerfile 也是一种代码,我们应该保持良好的代码编写习惯,晦涩难懂的代码尽量添加注释,让协作者可以一目了然地知道每一行代码的作用,并且方便扩展和使用。

保持容器最小化

应该避免安装无用的软件包,比如在一个nginx镜像中,我并不需要安装vim、gcc等开发编译工具,这样不仅可以加快容器构建速度,而且可以避免镜像体积过大。

合理选择基础镜像

容器的核心是应用,因此只要基础镜像能够满足应用的运行环境即可,例如一个php项目,运行时可能只需要php-fpm,并不需要php-cli,因此我们只需要安装php-fpm就行了。

尽量使用构建缓存

Docker 构建过程中,每一条Dockerfile 指令都会提交为一个镜像层,下一条指令都是基于上一条指令构建的。如果构建时发现要构建的镜像层的父镜像层已经存在,并且下一条命令使用了相同的指令,就可命中构建缓存。

在这里插入图片描述

基于Docker构建时的缓存特性,我们需要将不轻易改变的指令放到Dockerfile前面(例如安装包),而可能经常发生变化的指令则放在Dockerfile末尾 例如(编译应用程序)

FROM php:7.4
# 设置环境变量指令放前面
ENV TZ=Asia/Shanghai
# 安装软件指令放前面
RUN pecl install redis 
# 把业务软件的配置,版本经常变动的步骤放最后

按照上面原则编写的Dockerfile在构建镜像时,前面步骤命中缓存的概率会增加,可以加快构建速度。

正确设置时区

从docker-hub上拉取的官方镜像大多数都是 UTC时间,而我们在使用时需要将时区改为 中国区标准时间(东八区)。

# Ubuntu 和 Debian 系统
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shangehai" >> /etc/timezone

# centos
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

使用国内软件源加快镜像构建速度

由于很多镜像都是国外的,软件服务器也大部分在国外,所以我们构建镜像的时候想要安装一些软件包可能非常慢,这个时候我们就应该换成 国内的镜像源了:例如 阿里,华为 等
国内源地址

最小化镜像层数

在构建镜像时,尽可能的减少Dockerfile指令行数。因为每行都相当于一层镜像。

RUN pecl install mongodb \
	&& pecl install redis

# 而不应该写成这样:
RUN pecl install mongodb
RUN pecl install redis
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值