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

How to let dockerd create bind volume dirs with the correct permission

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

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

dockerd 创建目录 /tmp/michael,所有者和组 = root。这当然会导致 jboss 在尝试写入其日志文件时出现权限被拒绝的错误。

我必须手动创建 /tmp/michael 并授予 chmod g+w 权限才能修复该问题。 dockerd 然后以正确的权限重用现有目录。这不是我想要的。有谁知道如何强制 dockerd 以正确的权限创建这些目录

附加信息:

Docker 文件:

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

entrypoint.sh :(出于测试目的,只需触摸文件而不是开始 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. chown 在 ENTRYPOINT 的某处(为入口点创建一个 .sh)(以便从容器内部实现)

    类似于chown jboss:jboss /opt/jboss/wildfly/standalone/log

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

    你不会有jboss个用户或组,你需要直接用de id做。 查看容器 /etc/passwd 并获取 jboss 用户 id (docker exec jboss cat /etc/passwd),记下 id 并在主机中创建 chown:

    chown 1001:1001 /tmp/michael

最好的方法当然是1。您可以为其使用 docker 卷等。最简单的方法是 2.

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

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

然后在您的主机上您可以预先创建命名卷:

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 存在但为空,它就会在启动容器之前使用您的映像内容进行初始化,包括文件和目录权限。