Docker 复制并更改所有者

Docker Copy and change owner

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

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

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>

--chown 标志终于添加到 COPY:

COPY --chown=patrick hostPath containerPath

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

有关详细信息,请参阅 the PR