Docker 复制和更改所有者
Posted
技术标签:
【中文标题】Docker 复制和更改所有者【英文标题】:Docker Copy and change owner 【发布时间】:2015-05-06 21:52:44 【问题描述】:给定以下 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。但这似乎更像是一种 hack。
【问题讨论】:
在COPY
和MKDIR
之前我认为你应该有一个USER john
也许这可行,但我必须创建完整的目录结构并复制,所以这是不可接受的。
【参考方案1】:
我想我找到了一个可行的解决方案。使用数据卷容器可以解决问题。首先,我创建数据卷容器,其中包含我的外部目录的副本:
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>
。
【讨论】:
这和你之前的一样。您应该考虑接受另一个答案是正确的。它使用官方 docker 标志,无需编写脚本。 请考虑接受其他答案以帮助其他人!此外,您可能应该在Dockerfile
中执行 RUN <fullpath_of_setpermissions.sh>
【参考方案2】:
--chown
标志终于添加到COPY
:
COPY --chown=patrick hostPath containerPath
这种新语法似乎适用于 Docker 17.09。
更多信息请参见the PR。
【讨论】:
对我来说,它与--chown=user:group
一起工作,我在容器中创建了该用户和组
感谢您的评论,我使用了正常的 user.group
语法,但它不起作用,很高兴我偶然发现了这个。
@Torque user.group
“正常”语法在哪里? .
通常被接受为用户名的一部分,所以我有点怀疑/好奇为什么将它用作分隔符...
在 docker 版本:19.03.9 中,即使 ADD --chown=user:group
或 UID:GID
也能正常工作。
不管它值多少钱,user.group 曾经很常见。我不能给你一个参考,但我认为它可能已经在 Sun 的 YP 中使用过。无论如何,“正常”格式在某些时候从 user.group 更改为 user:group,但正如这些东西的本质一样,这两种格式都经常工作,所以有一段时间的人可能会被欺骗也就不足为奇了。跨度>
以上是关于Docker 复制和更改所有者的主要内容,如果未能解决你的问题,请参考以下文章