RUN
RUN 有2种形式:
-
RUN <command>
(shell窗口,命令是可以在shell里面运行,默认是使用 /bin/sh -c 在Linux 或 cmd /s /c 在 Windows) -
RUN ["executable", "param1", "param2"]
(exec form)RUN
指令会在当前镜像之上的新层执行一些命令和提交结果。生成提交的镜像将会被用于Dockerfile
的下一步.
分层运行指令和生成提交符合Docker的低成本核心概念,提交成本低和容器可以从镜像历史的任何点创建,非常像源码控制。
exec 形式可以尽可能消除shell语句逐步积累导致破坏系统,以及可以在不包含指定可执行shell的基础镜像上运行指令
使用 SHELL
指令可以改变 shell窗口默认的shell。
在 shell 窗口你可以使用 \
(反斜杠)去衔接一个 RUN 命令行在下一行。例如,考虑使用着2行:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
在一同一行,它们相当于一个命令:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
注意:使用一个不同的 shell,不同于 ‘/bin/sh’, 使用 exec 形式传到 想要传的shell。例如
RUN ["/bin/bash", “-c”, “echo hello”]注意:exec形式 被转换成一个 JSON 数组,这意味着你必须使用 双引号(")包着而不是单引号(’)。
注意: 不像shell形式,exec形式不启用命令shell。这个意味着正常的 shell 处理过程是不会发生的。例如
RUN [ “echo”, “$HOME” ]'是不会把$HOME变量替换。如果你想 shell 处理那么可以使用 shell形式或者直接
执行一个shell,例如:RUN [ “sh”, “-c”, “echo $HOME” ]。当使用 exec的形式和直接执行shell,与shell形式的情况
一样,这个是shell做环变量的扩展而不是docker。
注意:在 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
最佳实践指南可以获得更多信息。
关于 Dockerfile
的缓存,可以通过ADD
指令是其失效。详细查看下面。
已知问题(RUN)
-
Issue 783 是关于文件权限问题,发生再使用AUFS文件系统时。例如,你可能在尝试使用
rm
一个文件时会留意到。对于具有最近的aufs版本的系统(例如,可以设置dirperm 1
挂载选项),docker将尝试通过使用dirperm 1
选项挂载层来自动修复问题。