[英]How can i create a folder inside the shared volume with the correct permission in docker?
[英]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組的情況下,我也會收到拒絕的權限。 我不知道該如何擺脫
您有兩種可能性:
在ENTRYPOINT中的某個地方進行chown
(為入口點創建一個.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。
除了阿方索(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.