如何让 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,我也会收到拒绝的权限。我不知道如何摆脱它
你有两种可能:
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。您可以为其使用 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
存在但为空,它就会在启动容器之前使用您的映像内容进行初始化,包括文件和目录权限。
当我使用以下命令 运行 一个 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,我也会收到拒绝的权限。我不知道如何摆脱它
你有两种可能:
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。您可以为其使用 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
存在但为空,它就会在启动容器之前使用您的映像内容进行初始化,包括文件和目录权限。