簡體   English   中英

如何讓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使用所有者和組= root創建目錄/ tmp / michael。 當然,這會導致嘗試寫入其日志文件時jboss的權限被拒絕。

我必須手動創建/ tmp / michael並賦予chmod g+w權限以解決此問題。 dockerd然后以正確的權限重用現有目錄。 這不是我想要的。 有誰知道如何強迫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組的情況下,我也會收到拒絕的權限。 我不知道該如何擺脫

您有兩種可能性:

  1. 在ENTRYPOINT中的某個地方進行chown (為入口點創建一個.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。

除了阿方索(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存在但為空,它將在啟動容器之前使用映像的內容進行初始化,包括文件和目錄權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM