构建阶段指令(镜像构建时执行)
ENV vs RUN 变量:ENV 定义全局变量,整个 Dockerfile 可用;RUN 中定义的变量(如 VAR=value)仅当前 RUN 层有效。
运行时指令(容器启动时生效)
CMD 的四种写法对比
# 方式 1:Shell 形式(默认调用 /bin/sh -c)
CMD nginx -g "daemon off;"
# 方式 2:Exec 形式(推荐,但注意单字符串问题)
CMD ["nginx -g 'daemon off;'"] # 错误,会被当作一个整体命令找不到
# 方式 3:Exec 形式(正确,参数分离)
CMD ["nginx", "-g", "daemon off;"] # 推荐
# 方式 4:显式指定 Shell 执行(让 Shell 作为 PID 1)
CMD ["/bin/sh", "-c", "nginx -g 'daemon off;'"]
HEALTHCHECK 示例
HEALTHCHECK --interval=5s --retries=3 --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
ENTRYPOINT 与 CMD 协作模式
ENTRYPOINT ["/entrypoint.sh"] # 必定执行初始化脚本
CMD ["nginx", "-g", "daemon off;"] # 作为参数传入 entrypoint.sh
ENTRYPOINT 常用于启动应用前的初始化操作(如配置渲染、权限修正) 脚本最后一行必须是 exec "$@" 以处理传入的参数