首页/云/Docker 容器速查/RUN 两种形式的语义差异
镜像与构建107 条

RUN 两种形式的语义差异

shell 形式实际执行 /bin/sh -c "命令串",exec 形式直接执行可执行文件;默认 /bin/sh 往往不是 bash,语法差异要留心。

Docker 容器速查云更新于 2026-10-12
shell 形式RUN echo $HOME → 变量由 shell 展开
exec 形式RUN ["/bin/echo", "$HOME"] → 原样输出字符串
默认 shell/bin/sh(Debian 系为 dash)

示例

示例
# shell 形式:支持管道与变量
RUN ps aux | grep nginx || true

# exec 形式:不经 shell,参数原样传递
RUN ["/usr/bin/env", "bash", "-lc", "echo $PATH"]
需要 bash 特性时,用 SHELL ["/bin/bash", "-c"] 改默认 shell,或在命令里显式 bash -c。

易错点

  • 在是 dash 的基础镜像里写 [[ ]] 会报语法错误,构建失败信息常指向奇怪行号
  • exec 形式忘记写完整路径可能导致找不到命令,JSON 数组里不享受 PATH 之外的 shell 帮助

数据来源与参考

  • Docker 官方文档:Dockerfile RUN(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌