RUN指令用于Docker镜像构建,含Shell(如RUN apt-get update && apt-get install -y curl)和Exec格式(如RUN ["apt-get", "install", "-y", "vim"]),需合并命令、清理缓存、避免无效cd。

RUN 指令是 Docker 构建镜像时执行命令的核心指令,写法关键在于**选对格式、合并操作、避免冗余层**。它不决定容器运行时行为,只影响镜像构建过程。
两种写法:Shell 格式最常用
绝大多数场景用 Shell 格式即可,Docker 默认在 /bin/sh -c 下执行:
-
直接写命令:如
RUN apt-get update && apt-get install -y curl -
支持换行和逻辑连接:用
\折行,&&保证前一步成功才执行下一步 -
注意 shell 特性:能用变量(如
$HOME)、管道、重定向,但依赖基础镜像是否含对应 shell
Exec 格式:适合特殊需求
Exec 格式以 JSON 数组形式书写,绕过 shell 解析,适用于:
- 命令含引号、空格或特殊字符,shell 解析易出错时
- 需要精确控制执行环境(比如指定
/bin/bash而非默认/bin/sh) - Windows 容器中调用
.exe文件 - 示例:
RUN ["apt-get", "install", "-y", "vim"]或RUN ["/bin/bash", "-c", "echo hello > /tmp/msg"]
写 RUN 的实用建议
写得好,镜像更小、构建更快、缓存更有效:
- 多个命令尽量合并到一个 RUN:每个 RUN 都新增一层,拆成多条会膨胀镜像。例如把更新源、安装、清理写在一起
-
安装后及时清理缓存:尤其在 Debian/Ubuntu 中,加
&& rm -rf /var/lib/apt/lists/*可显著减小体积 -
避免无意义的 cd:
RUN cd /app && make不生效(每条 RUN 是独立 shell),应写成RUN cd /app && make && cd -或用WORKDIR配合 -
敏感操作慎用 &&:若中间某步失败,后续不会执行;必要时可加
|| true或拆开调试
常见错误避坑
这些写法看着合理,实际容易踩坑:
-
RUN mkdir /app && cd /app→cd在当前 RUN 生效,下个 RUN 又回到默认路径 -
RUN echo "export PATH=$PATH:/app/bin" >> /etc/profile→ shell 变量在构建时展开,不是运行时生效,推荐用ENV -
RUN pip install flask && pip install requests→ 应合并为一条pip install flask requests,减少层数


















