如何让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,我会收到拒绝的权限。 我不知道如何摆脱这一点
你有两种可能性:
-
在ENTRYPOINT的某个地方(为入口点做一个.sh)(在容器内部使其成为可能)
像
chown jboss:jboss /opt/jboss/wildfly/standalone/log
-
直接在容器外部(在主机中)更改权限
您将不会有
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
存在但是是空的,在容器启动之前,它将被初始化为映像的内容,包括文件和目录权限。