我如何将Docker COPY作为非root用户?

FGr*_*reg 103 docker dockerfile

在构建Docker镜像时,如何COPY将文件放入图像中,以便生成的文件归root用户所有?

FGr*_*reg 150

对于版本v17.09.0-ce和更新版本

将可选标志--chown=<user>:<group>ADDCOPY命令一起使用.

例如

COPY --chown=<user>:<group> <hostPath> <containerPath>
Run Code Online (Sandbox Code Playgroud)

--chown标志的文档现在在Dockerfile参考页面生效.

问题34263已合并,可在v17.09.0-ce版本中获得.


适用于v17.09.0-ce之前的版本

Docker不支持COPYroot用户以外的用户.你需要chown/ chmod文件之后COPY命令.

示例Dockerfile:

from centos:6
RUN groupadd -r myuser && adduser -r -g myuser myuser
USER myuser
#Install code, configure application, etc...
USER root
COPY run-my-app.sh /usr/local/bin/run-my-app.sh
RUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \
    chmod 744 /usr/local/bin/run-my-app.sh
USER myuser
ENTRYPOINT ["/usr/local/bin/run-my-app.sh"]
Run Code Online (Sandbox Code Playgroud)

在v17.09.0-ce之前,该COPY命令的Dockerfile参考说:

使用UID和GID为0创建所有新文件和目录.


历史 这个功能已经通过多种GitHub上的问题跟踪:6119,9943,13600,27303,28499,发行30110.

问题34263是实现可选标志功能的问题,问题467更新了文档.

  • 是的,此外,它会无缘无故地创建一个大的额外图像层(在我的例子中:&gt;300MB,用于在 40MB 的文件上运行“chown”)。 (3认同)
  • 令人沮丧的是,由于overlay2已成为默认的存储驱动程序,因此处理大量文件的速度变得异常缓慢 (2认同)
  • 将 chown 与 COPY 命令一起运行还有一个好处,即减小大小。如果我们分别运行这两个命令 (COPY &lt;host_path&gt; &lt;source_path&gt;; chown other_user:other_user) 那么它会创建一个额外的层,最终使图像大小加倍。 (2认同)
  • 我们惨痛地发现 docker 服务器版本很重要。 (2认同)