Docker最佳实践
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/docker-best-practices-yui4
技能介绍
这个技能解决什么问题
Docker 镜像经常膨胀到几百 MB,甚至包含编译器、测试框架和源码;构建缓存命中率低,改一行代码就全量重建;容器里跑的是 root,出漏洞时没有隔离;ADD、未固定的 node:latest、环境变量里的密钥,都是线上事故的常见来源。Dockerbestpractices 把这些散落的经验整理成一套可执行的构建约定和一份上线前检查表。
它如何工作
核心思路是分离构建环境与运行环境,并让每条指令都可缓存、可追溯:
- 多阶段构建(Multi-Stage Build):先在一个阶段安装依赖、编译,再把
runtime artifacts复制进最终镜像,构建工具和源码不会进入生产环境 - Python 多阶段:针对 Python 项目区分构建与运行依赖,避免把编译工具链留在镜像里
- Docker Compose:用
depends_on配合 health condition,让服务按依赖的健康状态启动,而不是盲目并行 - 镜像优化:合并
RUN指令减少层数,按变更频率从低到高排列指令,让缓存命中更稳定 - .dockerignore:始终配置,缩小
build context,防止.env、.git、node_modules等本地文件被打包进镜像 - 反模式清单:容器内以 root 运行、能用
COPY却用ADD、把密钥写进 Dockerfile 的ENV、不固定基础镜像版本、生产镜像装 dev dependencies
检查清单
- [x] 多阶段构建分离编译与运行阶段
- [x] 通过
USER指令使用非 root 用户 - [x] 基础镜像固定到具体版本(如
node:22-alpine) - [x]
.dockerignore排除.git、node_modules、.env - [x] 定义
HEALTHCHECK指令 - [x] 生产镜像不含构建工具和开发依赖
- [x]
docker-compose使用带健康条件的depends_on - [x] 密钥通过 build secrets 或运行时挂载传入,而非 Dockerfile 中的
ENV
适用边界与注意点
这套指南适用于应用镜像的构建与编排,不覆盖网络策略、镜像签名、漏洞扫描和运行时安全加固,需要配合 CI/CD 或安全工具使用。基础镜像版本固定后仍需定期跟进安全更新;depends_on 的健康条件不替代应用层的重试与超时逻辑;部分基础镜像没有非 root 用户,需要自行创建并确认应用可写目录。
使用场景
- 写 Dockerfile 时需要压缩镜像体积,避免把编译工具、测试框架和源码带进生产环境
- 用 Docker Compose 编排多个服务,希望依赖服务通过健康检查后再启动应用
- 排查镜像推送缓慢、构建上下文过大,需要补全 .dockerignore 排除规则
- 评审团队的 Dockerfile,逐项核对非 root 运行、版本固定与密钥注入是否达标
适合人员
- 后端工程师,需要把 Node.js 或 Python 服务打包成体积可控、可复现的镜像
- 运维工程师,负责制定容器镜像构建规范并审核团队的 Dockerfile
- CI/CD 流水线维护者,希望构建缓存命中率稳定且镜像构建不泄露密钥
- DevOps 负责人,在服务上线前对照检查清单逐项核对镜像安全与编排配置