Linux入门教程:Dockerfile参考(7) – RUN执行命令指令,这个新提交的镜像层将


RUN指令有两种形式:

RUN [shell形式,运行在shell的命令,默认是Linux上的/bin/sh -c或windows的cmd /S /C] RUN [“executable”, “param1”, “param2”][exec形式]

RUN指令将在当前镜像层上面的一个新数据层执行命令并提交其结果。这个新提交的镜像层将用于Dockerfile的下一步。
分层RUN指令和生成提交符合Docker的核心概念,其中提交成本低,可以从镜像历史中的任何点创建容器,就像源代码控制一样。
exec形式避免了shell字符的模糊处理,并且可以在没有特定shell的base镜像上使用RUN指令。
shell形式中默认的shell可以使用SHELL命令更改。
在shell形式中你可以使用\反斜杠在下一行继续这个RUN指令。例如下面两行:

RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME'

两行相当于:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

注意:要在exec形式中使用不同的shell,而不是/bin/sh,传递想用的shell即可,如,[“/bin/bash”, “-c”, “echo hello”]

注意:exec形式是接一个JSON数组,意味着在单词之外使用双引号而不是单引号。

注意:不像shell形式,exec形式不会调用一个shell再执行命令。意味着常规shell处理不会发生。例如,RUN [ “echo”, “$HOME” ]不会替换$HOME为家目录。如果你想处理此情况,可以直接使用shell形式或直接执行一个shell。如RUN [ “sh”, “-c”, “echo $HOME” ]。

注意:在JSON格式中,有必要转义反斜杠,特别是windows中使用反斜杠作为路径分隔符的情况。[“c:\windows\system32\tasklist.exe”] 会视为shell形式,因为这不是一个有效的JSON格式,正确的语法是RUN [“c:\\windows\\system32\\tasklist.exe”]。

RUN指令的缓存不会在下一次构建镜像时自动失效。一个指令的缓存如RUN apt-get dist-upgrade -y会在下一次构建中重用。可以使用–no-cache参数来使RUN指令的缓存失效,例如docker build –no-cache。

相关内容