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

275

在构建 Docker 镜像时,如何将文件 COPY 进镜像中,使得生成的文件归属于非 root 用户?

2个回答

416

对于版本 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以外的用户。您需要在COPY命令之后更改文件的所有者/权限(chown/chmod)。

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问题进行跟踪:61199943136002730328499Issue 30110

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


4
自从 overlay2 成为默认的存储驱动程序后,更改许多文件的所有者(chown)变得异常缓慢,这真是令人沮丧。 - hbogert
2
是的,此外,它为没有明显原因创建了一个大的额外图像层(在我的情况下:对40MB的文件运行chown,占用>300MB)。 - Dirk
2
运行COPY命令时,如果同时运行chown命令,还有一个好处是可以减小镜像的大小。如果我们分别运行这两个命令(COPY <host_path> <source_path>; chown other_user:other_user),那么会创建一个额外的层,最终将使镜像大小翻倍。 - abhishek thakur
这个答案真是救命稻草。非常感谢,解决了我几个小时的问题。 - Colby Hill
1
我们通过艰难的方式发现,Docker 服务器版本很重要。 - GaTechThomas

0

我是这样做的,而且完美无缺

FROM node:lts-alpine3.17
RUN addgroup app && adduser -S -G app app
RUN mkdir /app && chown app:app /app
USER app
WORKDIR /app
COPY --chown=app:app package*.json .
RUN npm install
COPY --chown=app:app . .
EXPOSE 8090
CMD ["npm","start"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接