参考:https://docs.docker.com/engine/reference/builder/#run
RUN 有两种形式
- RUN <command> (shell form,命令在shell中运行,默认为Linux上的 /bin/sh -c 或 Windows上的 cmd /S /C)
RUN ["executable", "param1", "param2"]
(exec form)
RUN指令将在当前image之上的新层中执行任何命令并提交结果。生成的提交图像将用于Dockerfile中的下一步.
分层RUN
指令和生成提交符合Docker的核心概念,其中提交很便宜,可以从映像历史中的任何点创建容器,很像源代码控制。
exec form 可以避免使用shell字符串,并使用不包含指定的shell可执行文件的基本映像运行命令。
可以使用shell命令更改shell窗体的默认shell。
在shell form中,您可以使用\(反斜杠)将单个运行指令延续到下一行。例如,考虑这两行:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
它们合起来等于这一行:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
注意:要使用不同于' /bin/sh '的shell,请使用传入所需shell的exec form 。例如
RUN ["/bin/bash", "-c", "echo hello"]
注意:exec form 被解析为JSON数组,这意味着必须在单词周围使用双引号("),而不是单引号(')。
注意:与shell form不同,exec form 不调用命令shell。这意味着不会发生正常的shell处理。例如,RUN ["echo", "$HOME"]不会对$HOME执行变量替换。如果您想要shell处理,那么要么使用shell表单,要么直接执行shell,例如:运行["sh", "-c", "echo $HOME"]。当使用exec form 并直接执行shell时(如shell form 的情况),执行环境变量扩展的是shell,而不是docker.
注意:在JSON格式中,必须转义反斜杠。这在以反斜杠为路径分隔符的窗口中特别相关。下面这行代码由于不是有效的JSON,将被视为shell表单,并以一种意外的方式失败:运行["c:\windows\system32\tasklist。本例的正确语法是:RUN ["c:\\windows\\system32\\tasklist.exe"]