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

如何解决Docker容器访问绑定卷的权限拒绝问题?

解决Docker绑定卷部署pgAdmin4的权限问题

问题背景

原本Docker Compose配置中,PostgreSQL使用绑定卷、pgAdmin4使用命名卷时应用运行正常。将pgAdmin4改为绑定卷后,容器启动失败,错误日志显示无法创建/var/lib/pgadmin/sessions目录,提示权限拒绝。

原始正常配置

version: '3.7'

services:

  PostgresDB:
    image: postgres    
    environment:
      - POSTGRES_DB=MyDatabase
      - POSTGRES_USER=MyUser
      - POSTGRES_PASSWORD=MyPassword
    volumes: 
      - ./data:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  PostgresDBAdmin:  
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: MyPasword
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"

volumes:
    pgadmin:

修改为绑定卷后的配置

version: '3.7'

services:

  PostgresDB:
    image: postgres    
    environment:
      - POSTGRES_DB=MyDatabase
      - POSTGRES_USER=MyUser
      - POSTGRES_PASSWORD=MyPassword
    volumes: 
      - ./data:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  PostgresDBAdmin:  
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: example@example.com
      PGADMIN_DEFAULT_PASSWORD: MyPasword
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - ./pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"

错误日志

PostgresDBAdmin_1  | ERROR  : Failed to create the directory /var/lib/pgadmin/sessions:
PostgresDBAdmin_1  |            [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
PostgresDBAdmin_1  | HINT   : Create the directory /var/lib/pgadmin/sessions, ensure it is writeable by
PostgresDBAdmin_1  |          'pgadmin', and try again, or, create a config_local.py file
PostgresDBAdmin_1  |          and override the SESSION_DB_PATH setting per
PostgresDBAdmin_1  |          https://www.pgadmin.org/docs/pgadmin4/6.18/config_py.html
PostgresDBAdmin_1  | Traceback (most recent call last):
PostgresDBAdmin_1  |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 82, in create_app_data_directory
PostgresDBAdmin_1  |     _create_directory_if_not_exists(config.SESSION_DB_PATH)
PostgresDBAdmin_1  |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 20, in _create_directory_if_not_exists
PostgresDBAdmin_1  |     os.mkdir(_path)
PostgresDBAdmin_1  | PermissionError: [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'

解决方案

方法一:调整宿主机绑定目录权限

pgAdmin4容器内部以pgadmin用户运行,该用户的UID和GID均为5050。直接修改宿主机上./pgadmin目录的归属权限:

chown -R 5050:5050 ./pgadmin

执行完命令后重启容器即可。

方法二:提前创建所需目录并设置权限

先手动在宿主机创建需要的目录,再设置权限:

mkdir -p ./pgadmin/sessions
chown -R 5050:5050 ./pgadmin

此方法可以直接预创建容器需要的目录,避免容器启动时因权限问题无法创建。

方法三:在Docker Compose中指定运行用户(不推荐)

在PostgresDBAdmin服务中添加user配置,强制容器以UID/GID为5050的用户运行:

PostgresDBAdmin:  
  image: dpage/pgadmin4
  environment:
    PGADMIN_DEFAULT_EMAIL: example@example.com
    PGADMIN_DEFAULT_PASSWORD: MyPasword
    PGADMIN_CONFIG_SERVER_MODE: 'False'
  volumes:
     - ./pgadmin:/var/lib/pgadmin
  ports:
    - "5050:80"
  user: "5050:5050"

注:此方法可能导致容器内部其他系统目录的权限问题,仅在其他方法无效时尝试。

原因说明

Docker命名卷由Docker自身管理,会自动适配容器内部用户的权限;而绑定卷直接映射宿主机目录,权限由宿主机系统控制,因此需要手动调整目录归属以匹配容器运行用户的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:20:46