Docker复制并更改所有者

Chr*_*ler 58 file-permissions docker 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
Run Code Online (Sandbox Code Playgroud)

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

如果我su john在容器内部进行操作,则无法访问测试目录中的任何文件或子目录.看来这个问题与aufs文件系统中的所有权有关,其中复制的目录仍由root拥有,权限设置为770.

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

Geo*_*zov 127

--chown最后添加了一个标志COPY:

COPY --chown=patrick hostPath containerPath
Run Code Online (Sandbox Code Playgroud)

这种新语法似乎适用于Docker 17.09.

有关更多信息,请参阅PR.

  • 对我来说,它使用`--chown = user:group`,我在容器中创建了该用户和组 (9认同)
  • @Torque “user.group”“正常”语法在哪里?“.”通常被接受作为用户名的一部分,所以我有点怀疑/好奇为什么有人会用它作为分隔符...... (4认同)

Chr*_*ler 10

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

FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

setpermissions脚本负责设置用户权限:

#!/bin/bash

if [ ! -e /data/.bootstrapped ] ; then
  chown -R john:mygroup /data
  touch /data/.bootstrapped
fi
Run Code Online (Sandbox Code Playgroud)

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

  • 这和以前一样.你应该考虑接受另一个答案是正确的.它使用官方docker标志,无需编写脚本. (3认同)