Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker复制和更改所有者_Docker_File Permissions_Dockerfile - Fatal编程技术网

Docker复制和更改所有者

Docker复制和更改所有者,docker,file-permissions,dockerfile,Docker,File Permissions,Dockerfile,给定以下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 如果在容器中执行sujohn,则无法访问测试目录中的任何文件或子目录。这个问题似乎与aufs文件系统

给定以下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

如果在容器中执行
sujohn
,则无法访问测试目录中的任何文件或子目录。这个问题似乎与aufs文件系统中的所有权有关,在aufs文件系统中,复制的目录仍然由root所有,权限设置为770


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

我想我找到了一个解决方案,它是有效的。使用数据卷容器就可以做到这一点。首先,我创建数据卷容器,其中包含我的外部目录的副本:

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
如果[!-e/data/.bootstrapped];然后
约翰:我的小组/数据
touch/data/.bootstrapped
fi
现在,我只需在运行应用程序容器时使用
--volumes from

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

COPY --chown=patrick hostPath containerPath
这个新语法似乎在Docker 17.09上起作用


有关更多信息,请参见。

复制之前
MKDIR
我认为您应该有一个
用户john
,也许这可以工作,但我必须创建完整的目录结构进行复制,因此这是不可接受的。对我来说,它与
--chown=USER:group
一起工作,我让那个用户和组在containerThanks中创建了那个评论,我使用了正常的
user.group
语法,但它不起作用,很高兴我偶然发现了这个语法。@Torque
user.group
的“正常”语法在哪里?
通常被接受为用户名的一部分,因此我有点怀疑/好奇为什么会将其用作分隔符……在docker版本:19.03.9中,甚至
ADD--chown=user:group
UID:GID
都很好用。不管它值多少,user.group过去都很常见。我不能给你一个参考,但我想它可能已经被用于太阳的YP。不管怎样,“正常”格式在某个时候从user.group改为user:group,但由于这两种格式的本质,这两种格式都经常工作,所以有一段时间的人可能会被欺骗也就不足为奇了。这和你以前遇到的情况一样。你应该考虑正确地接受另一个答案。它使用一个官方的码头标志为它没有脚本。请考虑接受另一个答案,也帮助其他人!此外,您可能应该在
Dockerfile