Docker镜像制作规范围绕可复现、可维护、可审计、可运行四大目标,强调分层清晰、安全最小化、构建可追溯及运行有约束。

Docker 镜像制作规范不是靠拍脑袋定的,而是围绕可复现、可维护、可审计、可运行四个刚性目标形成的工程共识。它不追求“完美语法”,而强调每一行指令背后有明确意图、可控体积、最小权限和清晰边界。
分层意图必须清晰
镜像本质是多层只读文件系统的叠加,每层对应一条关键指令。规范要求:
- FROM 必须指定固定版本基础镜像,如 python:3.11.9-slim,禁用 latest;
- WORKDIR 显式声明绝对路径,避免依赖默认行为导致 COPY 或 RUN 错位;
- RUN 指令合并执行并清理缓存,例如:RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*;
- COPY 仅用于本地文件复制,不用 ADD(不自动解压、不拉远程 URL);
- CMD/ENTRYPOINT 必须用 JSON 数组格式,如 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"],避免 shell 形式带来的 PID 1 问题。
安全与最小化是硬门槛
生产镜像不能“能跑就行”,必须满足基础安全水位:
- 必须配备 .dockerignore,至少排除 .git、node_modules、__pycache__、.env、*.log;
- 禁止 root 用户运行容器:先 RUN groupadd -g 1001 -f appuser && useradd -r -u 1001 -g appuser appuser,再 USER appuser;
- 基础镜像优先选 slim 或 alpine,Java 应用用 eclipse-temurin:17-jre-jammy 替代 full JDK;
- 敏感配置绝不写进镜像:密码、密钥、API token 等通过 docker run -e 或挂载 secret 文件注入,不在 ENV 或 COPY 中硬编码。
构建过程要可追溯、可管理
一次构建的结果必须能被团队复现、回滚、审计:
- 构建上下文(context)必须精准,命令末尾的 . 应指向最小必要目录,不把整个项目根或 home 目录设为上下文;
- 镜像标签必须语义化,用 -t myapp:v1.2.0 或 -t myapp:20260721,避免单用 latest;
- 多标签可同时打,如 -t myapp:dev -t myapp:20260730;
- Dockerfile 路径需显式指定,若不在当前目录,用 -f ./build/Dockerfile.prod,不依赖隐式查找。
运行约束要提前约定
镜像交付前就应定义好它的行为边界: - 容器只运行一个主进程,不启动 supervisord 或多个后台服务; - 无状态设计为默认前提,日志输出到 stdout/stderr,持久化数据通过 volume 或外部存储挂载; - EXPOSE 仅作文档说明,不替代实际端口映射,也不影响网络策略; - 健康检查(HEALTHCHECK)建议声明,尤其在 Kubernetes 环境中,让平台能主动探测服务可用性。


















