如何解决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
相关产品推荐
相关产品推荐

