Docker镜像构建的一些心得
Cloud Native Docker
Published: 2020-12-17

构建Docker镜像是服务容器化的基础,很多小细节都会影响镜像的构建速度、体积、安全性等。在此,我们整理了过去几年在实践中得出来的一些心得,分享给大家。

  1. 基础镜像选择可信赖的来源,如Docker官方,项目官方等
  2. 基础镜像避免使用latest版本,可能存在潜在不稳定风险
  3. 选择满足自己所需的最小基础镜像版本,降低体积,如:alpineSlim等(注意,alpine 不支持Python的wheel,会导致build速度非常慢,尽量不用)
  4. 尽可能减少运行层数,部分命令可以放一起运行
  5. 只安装必要依赖,并且安装后执行清理操作
  6. COPY添加文件,并且只添加必须的文件(避免使用ADD
  7. 使用.dockerignore声明忽略的文件
  8. 调整运行顺序,充分利用镜像层缓存(如:先COPY并安装依赖,再COPY完整项目)
  9. 编译型项目可以利用多阶段构建来充分降低镜像体积
  10. 镜像内创建普通用户,避免使用root账户
  11. 服务确保单一职责,尽可能一个容器只运行一个进程
  12. 服务状态确保可观测,避免使用守护进程
  13. 确保项目中日志重定向到stdout & stderr
  14. 可以考虑编写ENDPOINT使用的脚本,进行环境的一些预检查工作
  15. 适当添加LABELEXPOSE,补全镜像的基础信息
  16. 构建阶段,正确的设置镜像的tag,应包含分支名和git的commit_id