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