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?
如果commandB
和commandC
之间没有USER
命令,则用户www
运行commandC
,从USER的官方文档 :
USER指令设置运行映像时使用的用户名或UID以及Dockerfile中后面的RUN,CMD和ENTRYPOINT指令
所以你只需要用USER user
在真正需要的地方切换用户,而不是每个RUN
命令。 顺便说一下, USER
也适用于CMD
和ENTRYPOINT
,这意味着最后一个USER
命令中的用户也是在容器中运行你的进程的用户。