在Docker中创建的挂载文件夹是以root而不是当前用户身份创建的

7
尝试使用docker run命令将卷挂载到容器中。看起来文件夹总是以root身份创建,而不是容器用户。这使得我在文件夹上缺少权限(无法创建或写入日志文件)。
使用以下命令进行测试: docker run -it --entrypoint /bin/bash -v $PWD/logs:/home/jboss/myhub/logs:rw myImage:latest 现在执行命令:ls -ld /logs,结果为:drwxr-xr-x 2 root root 4096 Jun 12 13:01 logs/ 在这里,我们可以看到只有拥有者拥有写权限。而root是所有者。我希望jboss是这个文件夹的所有者。或者至少,在-v参数中给定:rw选项后,所有用户都具有读/写权限。
我没有理解错什么吗?如何让它按照我的意愿工作?
2个回答

8

目前,这是一个没有简单答案的经常性问题。

有两种常见方法。

第一种方法涉及在使用之前将目录的所有权先给 chown

RUN mkdir -p /home/jboss/myhub/logs ; chown -R jboss:jboss /home/jboss/myhub/logs
USER jboss

如果您需要使用不同的用户访问主机系统中的文件,您可以使用chmod命令更改应用程序在容器内使用jboss用户创建的文件的权限。

$ chmod -R +rw /home/jboss/myhub/logs

第二种方法涉及在运行应用程序之前,在Dockerfile(或者在您的主机系统中)使用适当的chmod创建文件。
$ touch /home/jboss/myhub/logs/app-log.txt
$ touch /home/jboss/myhub/logs/error-log.txt
$ chmod 766 /home/jboss/myhub/logs/app-log.txt
$ chmod 766 /home/jboss/myhub/logs/error-log.txt

当然还有更多的方法可以实现这一点,但我还没有听说过更多“本地”的解决方案。

我想找到一个更简单/更实用的方法。


最终只是创建了文件夹并在运行容器之前设置了权限。希望有更好的解决方案:( - mTv

5

@trust512正确地识别了问题,并正确指出没有普遍认可的“好解决方案”。@trust512提供了2个笨拙的解决方案。

我的解决方案不是更好,只是另一种选择。

安装您感兴趣的卷的父级。

例如,“/home/user” 应该由用户拥有,但如果我创建一个卷

docker volume create myhome

并将其像挂载一样挂载
docker container run --mount type=volume,source=myhome,destination=/home/user ...

那么 /home/user 将会被 root 拥有。

但是,如果我这样做:

docker volume create myhome &&
docker container run --mount type=volume,source=myhome,destination=/home alpine:3.4 mkdir /home/user &&
docker container run --mount type=volume,source=myhome,destination=/home alpine:3.4 chown 1000:1000 /home/user

当我运行时

docker container run --mount type=volume,source=myhome,destination=/home ...

然后/home/user将拥有适当的所有者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接