如何让dockerd用正确的权限创build绑定卷目录

当我使用以下命令运行docker容器时:

docker run -ti -v /tmp/michael:/opt/jboss/wildfly/standalone/log jboss 

dockerd用owner和group = root创build目录/ tmp / michael。 这当然会导致权限在试图写日志文件时拒绝jboss的错误。

我必须手动创build/ tmp / michael,并给予chmod g+w权限来解决这个问题。 然后dockerd以正确的权限重用现有的dir。 这不是我想要的。 有谁知道如何强制dockerd以正确的权限创build这些目录

附加信息:

Dockerfile:

 FROM jboss/wildfly ADD entrypoint.sh / ENTRYPOINT "/entrypoint.sh" 

entrypoint.sh :(用于testing目的只是触摸文件而不是启动jboss)

 #!/usr/bin/env bash chown jboss:jboss /opt/jboss/wildfly/standalone/log myfile=lala.`date +"%s"` touch /opt/jboss/wildfly/standalone/log/${myfile} 

但即使在这里,如果/ tmp / michael不存在,也没有组+ w,我会收到拒绝的权限。 我不知道如何摆脱这一点

你有两种可能性:

  1. 在ENTRYPOINT的某个地方(为入口点做一个.sh)(在容器内部使其成为可能)

    chown jboss:jboss /opt/jboss/wildfly/standalone/log

  2. 直接在容器外部(在主机中)更改权限

    您将不会有jboss用户或组,您需要直接使用de id。 查看容器/etc/passwd并获取jboss用户标识( docker exec jboss cat /etc/passwd ),记下标识并在主机中创buildchown

    chown 1001:1001 /tmp/michael

当然,最好的方法是1。 你可以使用一个泊坞窗的容量,等等。最简单的方法是2。

除了阿方索的回答之外,还有第三种select使用命名卷来初始化目录。 您需要首先在图像中创build具有正确权限的目录。 例如你的Dockerfile可以包含这些行:

 RUN mkdir -p /opt/jboss/wildfly/standalone/log \ && chmod 775 /opt/jboss/wildfly/standalone/log 

然后在您的主机上,您可以提前创build指定的卷:

 docker volume create --driver local \ --opt type=none \ --opt device=/tmp/michael \ --opt o=bind \ jboss_logs 

最后使用该命名卷运行您的容器:

 docker run -ti -v jboss_logs:/opt/jboss/wildfly/standalone/log jboss 

只要/tmp/michael存在但是是空的,在容器启动之前,它将被初始化为映像的内容,包括文件和目录权限。