Docker复制和更改所有者


73

鉴于以下Dockerfile

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash

在复制的测试目录中,我已将文件许可权设置为770。

如果su john在容器内部进行操作,则无法访问测试目录中的任何文件或子目录。似乎此问题与aufs文件系统中的所有权有关,在该文件系统中,复制的目录仍由root拥有,并且权限设置为770。

是否有解决此问题的方法以正确设置权限?一种可能是在复制之前将原始目录的权限设置为容器用户的uid。但这似乎更像是黑客。


COPYMKDIR我之前,我认为您应该有一个USER john
user2915097,2015年

也许这可能有效,但是我必须创建完整的目录结构才能复制,因此这是不可接受的。
Christian Metzler,2015年

Answers:


196

一个--chown标志终于被添加到COPY

COPY --chown=patrick hostPath containerPath

这种新语法似乎可以在Docker 17.09上使用。

有关更多信息,请参见PR


15
对我来说,它与之合作 --chown=user:group,我在容器中创建了该用户和组
Charan

感谢您的评论,我使用了常规user.group语法,但没有用,很高兴我偶然发现了这一点。
扭矩

4
@Torque user.group“普通”语法在哪里?.通常将A作为用户名的一部分,因此我对为什么有人将其用作分隔符感到有些怀疑/好奇……
Robin Thoni

在docker版本中:19.03.9,甚至ADD --chown=user:group还是UID:GID运行良好。
6

11

我想我找到了一个可行的解决方案。使用数据卷容器可以解决问题。首先,我创建数据卷容器,其中包含我的外部目录的副本:

FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh

在我有我的用户的应用程序容器中,看起来可能像这样

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
COPY setpermissions.sh /root/setpermissions.sh
CMD /root/setpermissions.sh && /bin/bash

setpermissions脚本完成了设置用户权限的工作:

#!/bin/bash

if [ ! -e /data/.bootstrapped ] ; then
  chown -R john:mygroup /data
  touch /data/.bootstrapped
fi

现在,我只需要--volumes-from <myDataContainerId>在运行应用程序容器时使用。


7
这与您以前一样。您应该考虑接受其他答案是正确的。它使用官方docker标志而不使用脚本。
Andras Gyomrey

请考虑接受其他答案也可以帮助其他人!此外,您可能应该只RUN <fullpath_of_setpermissions.sh>参加Dockerfile
Vassilis
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.