尝试通过命令将卷安装到我的容器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 成为该文件夹的所有者。或者至少所有用户都具有给定参数:rw中的选项的读/写权限-v
我在这里不明白什么?我怎样才能让它按照我想要的方式工作?
目前,这是一个反复出现的问题,没有简单的答案。
我听说有两种常见的方法。
首先涉及chown在使用目录之前对其进行 ing。
RUN mkdir -p /home/jboss/myhub/logs ; chown -R jboss:jboss /home/jboss/myhub/logs
USER jboss
Run Code Online (Sandbox Code Playgroud)
如果您需要使用不同的用户从主机系统访问文件,您可以chmod使用 jboss 用户在容器内创建应用程序的文件。
$ chmod -R +rw /home/jboss/myhub/logs
Run Code Online (Sandbox Code Playgroud)
第二种方法涉及在运行应用程序之前使用适当的(或在您的主机系统中)chmod创建文件。Dockerfile
$ 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
Run Code Online (Sandbox Code Playgroud)
当然还有更多方法可以实现这一目标,但我还没有听说过任何更多的“本机”解决方案。我想找到一种更简单/更实用的方法。
@trust512 正确地识别了问题,并且也正确地指出该问题没有普遍认可的“良好解决方案”。@trust512 提供了 2 个笨拙的解决方案。
我的解决方案并不更好——只是一种替代方案。
挂载您感兴趣的卷的父卷。
例如“/home/user”应该由用户拥有,但是如果我创建一个卷
docker volume create myhome
Run Code Online (Sandbox Code Playgroud)
并安装它就像
docker container run --mount type=volume,source=myhome,destination=/home/user ...
Run Code Online (Sandbox Code Playgroud)
那么/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
Run Code Online (Sandbox Code Playgroud)
然后当我跑步时
docker container run --mount type=volume,source=myhome,destination=/home ...
Run Code Online (Sandbox Code Playgroud)
那么/home/user就会有合适的主人。
| 归档时间: |
|
| 查看次数: |
6911 次 |
| 最近记录: |