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

mTv*_*mTv 8 docker

尝试通过命令将卷安装到我的容器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

我在这里不明白什么?我怎样才能让它按照我想要的方式工作?

tru*_*512 9

目前,这是一个反复出现的问题,没有简单的答案。

我听说有两种常见的方法。

首先涉及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)

当然还有更多方法可以实现这一目标,但我还没有听说过任何更多的“本机”解决方案。我想找到一种更简单/更实用的方法。


emo*_*ory 5

@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就会有合适的主人。