Docker中出现"Permission denied: '/var/lib/pgadmin/sessions'"错误

20

我遇到了这篇文章中描述的问题,但是它发生在docker容器里。我不知道pgadmin文件位于哪里,以便编辑其默认路径。我该如何解决这个问题?请尽可能详细,因为我不知道如何使用docker。

以下是docker-compose up命令的摘要:

php-worker_1  | 2020-11-11 05:50:13,700 INFO spawned: 'laravel-worker_03' with pid 67
pgadmin_1     | [2020-11-11 05:50:13 +0000] [223] [INFO] Worker exiting (pid: 223)
pgadmin_1     | WARNING: Failed to set ACL on the directory containing the configuration database:
pgadmin_1     |            [Errno 1] Operation not permitted: '/var/lib/pgadmin'
pgadmin_1     | HINT   : You may need to manually set the permissions on
pgadmin_1     |          /var/lib/pgadmin to allow pgadmin to write to it.
pgadmin_1     | ERROR  : Failed to create the directory /var/lib/pgadmin/sessions:
pgadmin_1     |            [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
pgadmin_1     | HINT   : Create the directory /var/lib/pgadmin/sessions, ensure it is writeable by
pgadmin_1     |          'pgadmin', and try again, or, create a config_local.py file
pgadmin_1     |          and override the SESSION_DB_PATH setting per
pgadmin_1     |          https://www.pgadmin.org/docs/pgadmin4/4.27/config_py.html
pgadmin_1     | /usr/local/lib/python3.8/os.py:1023: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
pgadmin_1     |   return io.open(fd, *args, **kwargs)
pgadmin_1     | [2020-11-11 05:50:13 +0000] [224] [INFO] Booting worker with pid: 224

我的docker-compose.yml文件:

  ### pgAdmin ##############################################
  pgadmin:
    image: dpage/pgadmin4:latest
    environment:
      - "PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}"
      - "PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}"
    ports:
      - "${PGADMIN_PORT}:80"
    volumes:
      - ${DATA_PATH_HOST}/pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres
    networks:
      - frontend
      - backend

1
你是否在容器内挂载了本地主机数据文件夹?你完成了这一步吗?https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html#mapped-files-and-directories - rzlvmp
@rzlvmp 我怎么确认这个?抱歉,我不懂docker.. - Silver Flash
你如何通过命令行运行Docker容器?你能提供命令吗?啊,好的。你正在使用docker-compose。请提供docker-compose.yml描述(不要忘记删除敏感信息)。 - rzlvmp
@rzlvmp 我相信敏感数据是由一个脚本设置到环境变量中的,在这一步之前我必须运行该脚本。 - Silver Flash
3个回答

35

好的,看起来问题出现在您尝试运行pgadmin服务时。

这部分内容

  ### pgAdmin ##############################################
  pgadmin:
    image: dpage/pgadmin4:latest
    environment:
      - "PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}"
      - "PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}"
    ports:
      - "${PGADMIN_PORT}:80"
    volumes:
      - ${DATA_PATH_HOST}/pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres
    networks:
      - frontend
      - backend

正如您所看到的,您试图将本地目录${DATA_PATH_HOST}/pgadmin挂载到容器的/var/lib/pgadmin目录中

    volumes:
      - ${DATA_PATH_HOST}/pgadmin:/var/lib/pgadmin

如您在此文章中所读,您本地的${DATA_PATH_HOST}/pgadmin目录的UID和GID必须是5050。这个5050是吗?

您可以通过运行以下命令来检查:

ls -l ${DATA_PATH_HOST}

输出结果将会像这样

drwxrwxr-x 1 5050 5050 12693 Nov 11 14:56 pgadmin
或者
drwxrwxr-x 1 SOME_USER SOME_GROUP 12693 Nov 11 14:56 pgadmin

如果SOME_USERSOME_GROUP的ID都是5050,那么就可以了。如上文所述,5050本身也可以。如果不是,则请尝试按照上面的文章描述执行。

sudo chown -R 5050:5050 ${DATA_PATH_HOST}/pgadmin

您还需要检查环境变量是否存在:

# run it as same user as you running docker-compose
echo ${DATA_PATH_HOST}
如果输出为空,您需要设置${DATA_PATH_HOST}或允许Docker从文件中读取变量。有很多方法可以做到这一点。

如果输出为空,您需要设置${DATA_PATH_HOST}或允许Docker从文件中读取变量。有很多方法可以做到这一点。


我正以普通用户身份运行,按照https://docs.docker.com/engine/install/ubuntu/和docker compose文档的所有说明,将自己添加到docker组中。输入“ls -l /pgadmin”时,没有找到任何文件。您是指当前目录吗?当前目录中没有pgadmin,但/var/lib中有一个。 - Silver Flash
1
如果${DATA_PATH_HOST}未设置,则${DATA_PATH_HOST}/pgadmin等于/pgadmin。Docker会尝试创建新目录(如果不存在)。也许Docker从另一个地方读取环境变量。这取决于您如何运行docker-compose。也许/var/lib/pgadmin是正确的路径。我看到有两个可能的问题:1.由于${DATA_PATH_HOST}未设置,因此未创建目录,2.目录存在但权限不正确(必须为5050或与容器用户ID相同)。 - rzlvmp
drwxrwxrwx means that all users can read/write into directory. I guess it is not correctly mounted inside container. check ${DATA_PATH_HOST} - rzlvmp
这是什么蠢货容器化的pgadmin,需要进入容器才能分配权限? - Simple Fellow
@SimpleFellow 你不需要。但是这里挂载了具有自己权限的外部卷。Docker对外部${DATA_PATH_HOST}/pgadmin中发生的情况一无所知。 - rzlvmp
显示剩余5条评论

6
在kubernetes环境中运行时,我必须添加这些值。
   spec:
     containers:
       - name: pgadmin
         image: dpage/pgadmin4:5.4
         securityContext:
           runAsUser: 0
           runAsGroup: 0

4
如果您使用的是Windows系统,请在docker-compose.yml中添加以下代码行。这将使容器能够访问您本地的文件夹。
version: "3.9"
services:
  postgres:
    user: root  <- this one 
    container_name: postgres_container
    image: postgres:14.2 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接