You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose挂载卷后Nginx容器显示目录为空的问题

问题分析与解决

你遇到的核心问题是Rootless Docker的用户/组权限映射特性,导致容器内无法访问主机上/etc/letsencrypt目录的内容,具体原因如下:

Rootless模式下,容器内的root用户(UID 0)会映射到主机上运行Docker的普通用户(而非主机root),同时容器内的用户组也会做类似映射:

  • 容器内的root组(GID 0)对应主机上该普通用户的主组,而非主机的docker组
  • 主机上/etc/letsencrypt的权限是drwxr-x--- root docker,仅root和docker组成员有权限访问,但容器内的root用户并未映射到主机的docker组,因此无法读取该目录下的内容,表现为挂载后目录为空。

你提到主机上的docker用户可以查看该目录,是因为该用户属于主机的docker组,但这个附加组权限不会自动同步到Rootless容器内。

解决方案

方案1:在容器中添加主机docker组的权限

  1. 先查询主机docker组的GID:
getent group docker | cut -d: -f3

假设输出为1001(根据你的实际环境调整)。

  1. 修改docker-compose.yml,给两个Nginx服务添加group_add配置,让容器内的root用户加入对应GID的组:
version: "3.9"
services:
  custom-nginx:
    image: custom-nginx:latest
    network_mode: host
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt:ro
    ports:
      - 80:80
      - 443:443
    restart: always
    group_add:
      - "1001" # 替换为你查询到的docker组GID

  nginx:
    depends_on:
        - custom-nginx
    image: nginx:alpine
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt:ro
    restart: always
    group_add:
      - "1001" # 替换为你查询到的docker组GID

方案2:给主机上的Docker运行用户添加ACL权限

直接给运行Rootless Docker的用户添加/etc/letsencrypt的递归访问权限,无需修改容器配置:

# 替换为你的Docker运行用户名,比如docker
setfacl -R -m u:docker:rx /etc/letsencrypt
# 确保后续生成的文件也能被访问
setfacl -R -m d:u:docker:rx /etc/letsencrypt

额外注意事项

  • Rootless Docker默认无法绑定低于1024的端口(如80、443),如果你的custom-nginx使用network_mode: host,需要先调整主机sysctl:
echo "net.ipv4.ip_unprivileged_port_start=80" | sudo tee /etc/sysctl.d/50-unprivileged-ports.conf
sudo sysctl --system
  • 检查live目录下的符号链接:虽然live和archive权限足够,但容器内挂载时符号链接会保持原样,由于你已经挂载了整个/etc/letsencrypt,所以../../archive/xxx的路径在容器内是有效的。

内容的提问来源于stack exchange,提问作者unsafe_where_true

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:05:34