鉴于以下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。
su john
是否有解决此问题的方法以正确设置权限?一种可能是在复制之前将原始目录的权限设置为容器用户的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>在运行应用程序容器时使用即可。
--volumes-from <myDataContainerId>