运行指令
RUN
有两种形式:
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)
RUN
指令将在当前图像之上的新图层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile
中的下一步。
分层 RUN
指令和生成提交符合 Docker 的核心概念,其中提交很便宜,并且可以从图像历史中的任何点创建容器,就像源代码控制一样。
exec 表单可以避免 shell 字符串重写,并使用不包含指定 shell 可执行文件的基本映像来执行 RUN
命令。
可以使用 SHELL
命令更改 shell 表单的默认 shell。
在 shell 形式中,你可以使用\
(反斜杠)将单个 RUN
指令继续到下一行。例如,考虑以下两行:
RUN /bin/bash -c 'source $HOME/.bashrc ;\
echo $HOME'
它们一起相当于这一行:
RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
注意:要使用除“/ bin / sh”之外的其他 shell,请使用传入所需 shell 的 exec 表单。例如,RUN ["/bin/bash", "-c", "echo hello"]
注意:exec 表单被解析为 JSON 数组,这意味着你必须在单词(‘
)周围使用双引号(“
)。
注意:与 shell 表单不同,exec 表单不会调用命令 shell。这意味着不会发生正常的 shell 处理。例如,RUN [ "echo", "$HOME" ]
不会对 $HOME
进行变量替换。如果你需要 shell 处理,则可以使用 shell 表单或直接执行 shell,例如:RUN [ "sh", "-c", "echo $HOME" ]
。
注意:在 JSON 表单中,必须转义反斜杠。这在反斜杠是路径分隔符的 Windows 上尤为重要。由于不是有效的 JSON,以下行将被视为 shell 表单,并以意外方式失败:RUN ["c:\windows\system32\tasklist.exe"]
此示例的正确语法是:RUN ["c:\\windows\\system32\\tasklist.exe"]
RUN
指令的缓存在下一次构建期间不会自动失效。像 RUN apt-get dist-upgrade -y
这样的指令的缓存将在下一次构建期间重用。使用 –no-cache 标志可以使 RUN
指令的高速缓存无效,例如 docker build –no-cache。
有关详细信息,请参阅 Dockerfile 最佳实践指南。
RUN
指令的缓存可以通过 ADD
指令无效。请参阅下文了解详情。