如何以非root用户身份使用Docker COPY?


142

在构建Docker映像时,如何COPY将文件存储到映像中,以便生成的文件由root以外的用户拥有?

Answers:


205

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

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

例如

COPY --chown=<user>:<group> <hostPath> <containerPath>

--chown标志的文档现在位于Dockerfile参考主页面上

版本34263已被合并,可以在v17.09.0-ce版本中使用


对于v17.09.0-ce之前的版本

Docker不COPY以root用户身份支持用户身份。您需要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"]

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

创建的所有新文件和目录的UID和GID为0。


历史 这个功能已经通过多种GitHub上的问题跟踪:61199943136002730328499发行30110

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


3
令人沮丧的是,由于overlay2成为默认的存储驱动程序以来,处理大量文件的速度变得异常缓慢
hbogert

1
是的,此外,它没有明显的原因会创建一个较大的额外图像层(在我的情况下:> 300MB,用于运行chown40MB的文件)。
德克(Dirk)

与COPY命令一起运行chown还有一个好处,那就是尺寸减小。如果我们分别运行这两个命令(COPY <host_path> <source_path>; chown other_user:other_user),则会创建一个额外的层,最终使图像大小增加一倍。
abhishek thakur

这个答案是救生员。非常感谢您,解决了我已经奋斗了几个小时的问题。
Colby Hill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.