[英]How to specify userid and groupid for volume mount point on Docker host
我對這個問題有一段時間感到沮喪,因為這里已經多次詢問過這個問題,例如在如何處理 Docker 中的持久存儲(例如數據庫)和管理 Docker 共享卷權限的(最佳)方法是什么? ,但答案根本沒有解決問題。
第一個“答案”說只使用named volumes
而不是傳統的bind mounts
。 這沒有解決任何問題,因為當命名卷安裝在主機上時,例如在默認位置/var/lib/docker/volumes/<volume name>/_data
,那么該安裝點將具有安裝點的uid
/ gid
容器內。
在 docker 命名卷之前給出的另一個“答案”是使用純數據容器。 這展示了同樣的問題。
這對我來說是一個大問題的原因是我有很多嵌入式機器,我想在上面運行 docker 主機,並且用戶可能在每台機器上都有不同的uid
/ gid
。 因此,我無法在 Dockerfile 中為我的持久卷的掛載點硬編碼uid
/ gid
,以實現匹配的id
。
這是問題的一個示例:假設我的用戶是主機上的foo
,具有uid 1001
和gid 1001
,並且將文件寫入容器內的卷的用戶具有uid 1002
。 當我運行容器時,docker 將chown 1002:1002
主機上的掛載點目錄,並用這個uid
寫入文件,我什至不能用我的用戶foo
讀/寫。
視覺上(主機上的所有這些操作):
$ docker volume create --driver local --opt type=volume --opt device=/home/<my_host_user>/logs --opt o=bind logs
logs
$ docker volume inspect logs
[
{
"CreatedAt": "2020-08-26T16:26:08+01:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/logs/_data",
"Name": "logs",
"Options": {
"device": "/home/<myhostuser>/logs",
"o": "bind",
"type": "volume"
},
"Scope": "local"
}
]
$ pwd
/home/foo
$ mkdir logs && ls -ld logs
drwxr-xr-x 2 foo foo 4096 Aug 26 17:24 logs
然后運行容器:
$ docker run --rm --name <cont_name> -it --net="host" --mount src=logs,target=/home/<container_user>/logs <my docker image>
現在掛載點:
$ ls -ld logs
drwxr-xr-x 2 1002 1002 4096 Aug 26 17:30 logs
$ ls -l logs/
total 4
-rw-r----- 1 1002 1002 0 Aug 26 17:30 log
-rw-r----- 1 1002 1002 2967 Aug 26 17:27 log.1
如您所見,寫入卷的日志有一個uid
/ gid
,它與主機上存在的內容不對應,並且我無法在沒有 root/sudo 的情況下訪問。
那么,有什么方法可以告訴 docker 將容器中的uid
/ gid
映射到主機上的uid
/ gid
,或者更簡單地使用指定的uid
/ gid
作為主機掛載點?
我的環境:
創建具有適當權限的安裝點路徑。
# docker file
RUN mkdir --parents '$volumeDir' ; chown --recursive '$userName':'$userGroup' '$volumeDir'
接下來,創建容器並掛載卷。
# terminal
docker run --name=containerName --interactive
--user=$userName:$userGroup --mount='source=volumeName,target==$volumeDir,readonly=false'
imageName /bin/bash
您將獲得適當的許可
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.