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。

【问题讨论】:

COPYMKDIR之前我认为你应该有一个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:groupUID:GID 也能正常工作。 不管它值多少钱,user.group 曾经很常见。我不能给你一个参考,但我认为它可能已经在 Sun 的 YP 中使用过。无论如何,“正常”格式在某些时候从 user.group 更改为 user:group,但正如这些东西的本质一样,这两种格式都经常工作,所以有一段时间的人可能会被欺骗也就不足为奇了。跨度>

以上是关于Docker 复制和更改所有者的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 配置 mongodb 副本集/复制集

docker存储驱动

如何更改docker image里面文件权限

`docker cp` 命令如何工作

如何保存所有 Docker 镜像并复制到另一台机器

在文件更改时重建 Docker 容器