给出以下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。但这似乎更像是黑客。
答案 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