sn0wdr1am
V2EX  ›  Docker

求教一个 Docker 挂载文件夹的权限问题

  •  
  •   sn0wdr1am · Jan 19, 2025 · 2772 views
    This topic created in 659 days ago, the information mentioned may be changed or developed.
    1. 宿主机假设是 ubuntu ,用户 root
    2. docker 容器假设是 alpine ,用户 alpine
    3. 假设一个宿主文件夹 config ,要挂载到容器 alpine 内部。

    这个时候有一个问题,config 在宿主机,属于 root ,挂载到容器 alpine 内后,还是显示属于 root 。 导致容器 alpine 内部,普通用户 alpine ,对于挂载文件夹没有权限做操作。

    https://github.com/moby/moby/issues/3124

    应用场景:docker 容器是 aria2 ,挂载本地文件夹,用作下载文件夹。

    这种问题,通常怎么解决。

    15 replies  •  2025-01-20 08:59:01 +08:00
    skydirewolf
    skydirewolf
    Jan 19, 2025
    1
    试试加 --privileged=true
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 19, 2025
    2
    @skydirewolf 这个选项看起来简单粗暴,但是我一般能不加就不加。
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 19, 2025
    3
    有一个方案,就是:宿主机上的文件夹(将要挂载到容器内部),在宿主机上设置 777.
    caola
    caola
    Jan 19, 2025
    4
    容器内也使用 root 用户不就行了,感觉容器内不是那么必要使用非 root
    hingle
    hingle
    Jan 19, 2025
    5
    宿主机都用 root 了,直接把挂载的目录和文件 uid 改成容器一样就好了。
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 19, 2025
    6
    @caola 以前一直这么干,所以没发现有这个问题。但是我看别人都建议不用 root 。
    ysc3839
    ysc3839
    Jan 19, 2025 via Android
    7
    是比较麻烦,内外都是按 UID 进行区分的,一般建议要不然都 root ,要不然 UID 保持一致,比如都用 1000 ,一些特殊场景比如 www-data/http 的都用 33 。
    0x42
    0x42
    Jan 19, 2025 via Android
    8
    目标文件在宿主机直接改成容器内用户的 uid:gid 就好了
    superhot
    superhot
    Jan 19, 2025
    9
    我也遇到了这个问题,不过更复杂一些,是 VSCode DevContainer on WSL2 & macOS:
    https://www.v2ex.com/t/1105180
    好像没什么好办法,macOS 上对所有权的限制宽松一些,WSL2 更严格。现在老老实实用 volume 了。
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 19, 2025
    10
    一个不太完美的解决方案:

    加一个小尾巴,修改挂载文件夹的归属。(可能会改变宿主机被挂载文件夹的 uid ,gid )。
    chown -Rv transmission:transmission /var/lib/transmission

    ```
    docker run -d \
    --name=transmission \
    -u 1000:1000 \
    -e TZ=Etc/UTC \
    -e RPC_USER=admin \
    -e RPC_PASS=admin \
    -e RPC_PORT=9091 \
    -e PEER_PORT=51413 \
    -p 9091:9091 \
    -p 51413:51413 \
    -p 51413:51413/udp \
    -v ./config:/var/lib/transmission/config \
    -v ./downloads:/var/lib/transmission/downloads \
    -v ./incomplete:/var/lib/transmission/incomplete \
    -v ./torrents:/var/lib/transmission/torrents \
    --restart unless-stopped \
    dev/tr:alpine chown -Rv transmission:transmission /var/lib/transmission
    ```
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 19, 2025
    11
    Linux 系统里 Docker 容器挂载目录导致的权限问题

    https://www.yangdx.com/2020/06/160.html


    看起来这两种方法都可以,都不算完美。
    xiao17
    xiao17
    Jan 19, 2025
    12
    容器也用 root 可以吗?我遇到的容器都是 root
    bluedawn
    bluedawn
    Jan 20, 2025
    13
    你看一下容器内 alpine 用户的 uid 和 gid 是多少
    在宿主文件夹 chown 一下不就好了
    反正宿主是 root 是多少都能访问
    sn0wdr1am
    sn0wdr1am
    OP
    Jan 20, 2025
    14
    @bluedawn 是的。容器内外主要对准 uid ,gid ,使用 chown 可以同步,就是麻烦一点。
    y1y1
    y1y1
    Jan 20, 2025 via iPhone
    15
    把目录删了再 run
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4549 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    ♥ Do have faith in what you're doing.