Docker复制并更改所有者

时间:2015-03-05 13:49:05

标签: 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。

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

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

3 个答案:

答案 0 :(得分:87)

--chown标志最终已添加到COPY

COPY --chown=patrick hostPath containerPath

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

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

答案 1 :(得分:10)

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

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>

答案 2 :(得分:0)

我将文件复制到临时目录(例如> where java C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe <br/> C:\Program Files\Java\jdk1.8.0_192\bin\java.exe ),而不是在需要时使用/tmp/复制文件。

RUN cp