Dockerfile:是否需要在执行RUN之前指定哪个用户?

我正在寻找由Github上的某个人创build的Dockerfile,我注意到Docker文件中的每一次定义了一个RUN,在它之前是一个USER用户名指令。

这是强制性的吗? 或者它是设置级联样式?

USER root RUN commandA USER www RUN commandB .... RUN commandC 

哪个用户会执行commandC? 最新申报(www)? 或者还有其他的东西(一些其他的Docker命令可以把它改成默认的,除了USER显然)执行后的RUN本身可能会重置用户?

还是只是为了更冗长?

没有必要,没有。 为Dockerfile提供一个USER以避免以root身份运行所有内容总是不错的做法,但有时候构build需要翻转和转发。 这就是你可能会看到的地方:

 ... USER alice RUN ... // do stuff USER root RUN ... // do super privileged stuff USER alice CMD ... // run my app as non-privileged user ... 

如果你不需要翻转和翻转,那么一个USER指令就会级联到它下面的所有指令。

 ... USER alice RUN ... // as alice WORKDIR ... RUN ... // as alice ENV ... RUN ... // as alice CMD ... // as alice ... 

哪个用户会执行commandC?

如果commandBcommandC之间没有USER命令,则用户www运行commandC ,从USER的官方文档 :

USER指令设置运行映像时使用的用户名或UID以及Dockerfile中后面的RUN,CMD和ENTRYPOINT指令

所以你只需要用USER user在真正需要的地方切换用户,而不是每个RUN命令。 顺便说一下, USER也适用于CMDENTRYPOINT ,这意味着最后一个USER命令中的用户也是在容器中运行你的进程的用户。