当我使用以下命令运行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,我确实会收到拒绝许可。我不知道如何摆脱那个
答案 0 :(得分:1)
您有两种可能性:
chown
在ENTRYPOINT中的某个位置(为入口点创建.sh)(从容器内部实现此目的)
像chown jboss:jboss /opt/jboss/wildfly/standalone/log
直接在容器外部(在主机中)更改权限
您不会拥有jboss
用户或群组,您需要直接使用de id。
查看容器/etc/passwd
并获取jboss用户ID(docker exec jboss cat /etc/passwd
),记下id并在主机中创建chown
:
chown 1001:1001 /tmp/michael
当然,最佳方式是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
存在但是为空,它将在容器启动之前使用图像内容进行初始化,包括文件和目录权限。