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

时间:2017-04-18 10:55:42

标签: docker dockerfile

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

是强制性的吗?或者它是否设置了级联风格?

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

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

或者仅仅是为了更加冗长?

2 个答案:

答案 0 :(得分:2)

没有必要,没有。为Dockerfile提供USER以避免以root运行所有内容始终是一种好习惯,但有时构建需要前后翻转。您可能会看到的地方:

...
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
...

答案 1 :(得分:1)

  

用户将执行commandC?

如果USERcommandB之间没有commandC命令,那么www的用户commandC运行USER user:< / p>

  

USER指令设置运行映像时要使用的用户名或UID,以及在Dockerfile中关注的任何RUN,CMD和ENTRYPOINT指令

因此,您只需使用RUN将用户切换到您真正需要的位置,而不是每个USER命令。顺便说一下,CMD也适用于ENTRYPOINTUSER,这意味着最后func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! let ciimage : CIImage = CIImage(cvPixelBuffer: imageBuffer) let image : UIImage = self.convert(cmage: ciimage) } // Convert CIImage to CGImage func convert(cmage:CIImage) -> UIImage { let context:CIContext = CIContext.init(options: nil) let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)! let image:UIImage = UIImage.init(cgImage: cgImage) return image } 命令中的用户也是在容器中运行您的进程的用户。