簡體   English   中英

如何為 Docker 主機上的卷掛載點指定用戶 ID 和組 ID

[英]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 1001gid 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作為主機掛載點?

我的環境:

  1. Ubuntu 22.04
  2. Docker 版本 20.10.17,構建 100c701

創建具有適當權限的安裝點路徑。

# 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.

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