构建Docker镜像是服务容器化的基础,很多小细节都会影响镜像的构建速度、体积、安全性等。在此,我们整理了过去几年在实践中得出来的一些心得,分享给大家。
- 基础镜像选择可信赖的来源,如Docker官方,项目官方等
- 基础镜像避免使用
latest版本,可能存在潜在不稳定风险 - 选择满足自己所需的最小基础镜像版本,降低体积,如:
alpine、Slim等(注意,alpine不支持Python的wheel,会导致build速度非常慢,尽量不用) - 尽可能减少运行层数,部分命令可以放一起运行
- 只安装必要依赖,并且安装后执行清理操作
- 用
COPY添加文件,并且只添加必须的文件(避免使用ADD) - 使用
.dockerignore声明忽略的文件 - 调整运行顺序,充分利用镜像层缓存(如:先
COPY并安装依赖,再COPY完整项目) - 编译型项目可以利用多阶段构建来充分降低镜像体积
- 镜像内创建普通用户,避免使用
root账户 - 服务确保单一职责,尽可能一个容器只运行一个进程
- 服务状态确保可观测,避免使用守护进程
- 确保项目中日志重定向到
stdout & stderr - 可以考虑编写
ENDPOINT使用的脚本,进行环境的一些预检查工作 - 适当添加
LABEL和EXPOSE,补全镜像的基础信息 - 构建阶段,正确的设置镜像的
tag,应包含分支名和git的commit_id