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选项挂载层来自动修复问题。