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

时间:2017-11-28 11:12:41

标签: docker wildfly

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

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

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

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

其他信息:

Dockerfile:

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,我确实会收到拒绝许可。我不知道如何摆脱那个

2 个答案:

答案 0 :(得分:1)

您有两种可能性:

  1. chown在ENTRYPOINT中的某个位置(为入口点创建.sh)(从容器内部实现此目的)

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

  2. 之类的东西
  3. 直接在容器外部(在主机中)更改权限

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

    chown 1001:1001 /tmp/michael

  4. 当然,最佳方式是1。您可以使用泊坞窗卷等。最简单的方法是2。

答案 1 :(得分:1)

除了Alfonso的回答,还有第三种方法可以使用命名卷来初始化目录。您需要先在图像中创建具有正确权限的目录。例如。您的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存在但是为空,它将在容器启动之前使用图像内容进行初始化,包括文件和目录权限。