使用dpage/pgadmin4镜像运行docker-compose up时出现权限异常问题

4

我正在尝试使用docker-compose构建一个包含pgadmin4的ruby rails和postgreSQL数据库,但是容器中一直出现权限异常。即使在容器中运行/bin/sh也会返回相同的错误。

我正在使用Ubuntu 18.04.3 LTS。

完整日志:

db_1            | 
db_1            | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1            | 
db_1            | LOG:  database system was shut down at 2020-02-05 07:15:13 UTC
db_1            | LOG:  MultiXact member wraparound protections are now enabled
db_1            | LOG:  autovacuum launcher started
db_1            | LOG:  database system is ready to accept connections
pgadmin_1       | [2020-02-05 07:15:17 +0000] [1] [INFO] Starting gunicorn 19.9.0
pgadmin_1       | [2020-02-05 07:15:17 +0000] [1] [INFO] Listening at: http://[::]:80 (1)
pgadmin_1       | [2020-02-05 07:15:17 +0000] [1] [INFO] Using worker: threads
pgadmin_1       | [2020-02-05 07:15:17 +0000] [13] [INFO] Booting worker with pid: 13
pgadmin_1       | [2020-02-05 07:15:17 +0000] [13] [ERROR] Exception in worker process
pgadmin_1       | Traceback (most recent call last):
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
pgadmin_1       |     worker.init_process()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 104, in init_process
pgadmin_1       |     super(ThreadWorker, self).init_process()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 129, in init_process
pgadmin_1       |     self.load_wsgi()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
pgadmin_1       |     self.wsgi = self.app.wsgi()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
pgadmin_1       |     self.callable = self.load()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
pgadmin_1       |     return self.load_wsgiapp()
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
pgadmin_1       |     return util.import_app(self.app_uri)
pgadmin_1       |   File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 350, in import_app
pgadmin_1       |     __import__(module)
pgadmin_1       |   File "/pgadmin4/run_pgadmin.py", line 4, in <module>
pgadmin_1       |     from pgAdmin4 import app
pgadmin_1       |   File "/pgadmin4/pgAdmin4.py", line 109, in <module>
pgadmin_1       |     app = create_app()
pgadmin_1       |   File "/pgadmin4/pgadmin/__init__.py", line 350, in create_app
pgadmin_1       |     paths.init_app(app)
pgadmin_1       |   File "/pgadmin4/pgadmin/utils/paths.py", line 92, in init_app
pgadmin_1       |     'The user does not have permission to read and write to the '
pgadmin_1       | Exception: The user does not have permission to read and write to the specified storage directory.
pgadmin_1       | [2020-02-05 07:15:17 +0000] [13] [INFO] Worker exiting (pid: 13)
pgadmin_1       | [2020-02-05 07:15:17 +0000] [1] [INFO] Shutting down: Master
pgadmin_1       | [2020-02-05 07:15:17 +0000] [1] [INFO] Reason: Worker failed to boot.
***_pgadmin_1 exited with code 3

docker-compose.yml 文件

version: '3'
services:
  db:
    image: postgres:9.5
    volumes:
      - postgres:/var/lib/postgresql/data
  pgadmin:
    image: dpage/pgadmin4
    volumes:
      - pgadmin:/var/lib/pgadmin/storage
    ports:
      - '3030:80'
    environment:
      PGADMIN_DEFAULT_EMAIL: 'admin'
      PGADMIN_DEFAULT_PASSWORD: password
    depends_on:
      - db
volumes:
  postgres:
  pgadmin:

因为我认为它不相关,所以删除了Ruby on Rails服务。

在pgadmin容器中删除卷允许我在容器中使用/bin/sh,但我无法使用任何命令。


听起来你的pgadmin容器没有对./pgadmin文件夹的读写权限? - richyen
@richyen,我该怎么解决这个问题?我对Docker还不是很熟悉。我正在使用Linux,chown或chmod可以解决这个问题吗?如果可以,我该如何使用它们? - NganCun
我其实不确定——这取决于您的操作系统、目录树的样子、您使用哪个操作系统用户来执行 docker-compose up 等等。 - richyen
4个回答

7

我曾经遇到过同样的问题。我通过在略微不同的位置挂载卷来解决了它:

    volumes:
      - pgadmin:/var/lib/pgadmin4/storage

请注意,您的脚本中它被挂载在 /var/lib/pgadmin/storage

2
我遇到了与图像dpage / pgadmin4:4.18相同的问题。 我进行了一些挖掘,不知为何pgadmin未在服务器模式下运行,这导致它使用不同的目录,无法通过权限检查。
要解决此问题,我添加了一个PGADMIN_CONFIG_SERVER_MODE环境变量,并将其设置为True。 在您的情况下,您将向docker-compose.yml添加另一个环境变量,请参阅以下内容:
PGADMIN_CONFIG_SERVER_MODE: True

首字母大写非常重要。该行将被转换为Python代码(对于那些想知道的人,在config_distro.py中设置SERVER_MODE = True),如果'T'未大写,则会失败。


1
我有完全相同的问题。当我添加这个变量时,我得到另一个错误ERROR: The Compose file './docker-compose.yml' is invalid because: services.pgadmin.environment.PGADMIN_CONFIG_SERVER_MODE contains true, which is an invalid type, it should be a string, number, or a null。你有任何想法如何解决这个问题吗?请注意,我在docker-compose.yml文件中大写了第一个字母。 - eastclintw00d
@eastclintw00d 我的 docker-compose.yml 文件中 pgadmin 变量部分(版本为2)如下所示:- PGADMIN_CONFIG_SERVER_MODE=True据我所知,如果该行未按照 docker-compose 期望的格式进行格式化,将会出现无效类型错误。 - Alan Hecht
1
你应该在值周围加上引号 PGADMIN_CONFIG_SERVER_MODE: 'True' - Joram
2
有没有任何来源可以记录“PGADMIN_CONFIG_SERVER_MODE”的确切含义?截至2022年7月7日,我找不到任何相关信息。 - D M

0
我遇到了类似的问题。考虑到您发布的日志。 如果您阅读日志的最后几行,您会注意到问题与权限有关:“异常:用户没有权限读取和写入指定的存储目录。”
在dpage/pgadmin4容器中的用户没有权限在指定目录中读取和写入,这种情况下是您映射到镜像卷的pgadmin文件夹。
默认情况下,pgadmin镜像具有用户pgadmin用户(UID:5050)和pgadmin组(GID:5050),该用户无法在主机上(即您的计算机)读取和写入。要使其成为可能,您只需运行以下命令:
`sudo chown -R 5050:5050 <host_directory>`

运行docker compose,然后导航到它创建的文件夹,确保你在里面,即映射到卷的那个文件夹,你的情况是pgadmin。
进入文件夹后,在终端中执行类似以下命令:sudo chown -R 5050:5050 . 现在用户具有读写权限。再次运行docker compose,它将创建所有所需的文件夹和文件,并且容器应该能够正常运行。 在这里查看文档

请注意,当映射卷时,不需要指定“storage”,它将默认创建。在其中,有一个以您在docker-compose文件中指定的电子邮件PGADMIN_DEFAULT_EMAIL: 'admin'命名的文件夹。这是您将用于恢复数据库的文件的位置。 - undefined

-1
尝试移除并重新创建Docker卷,使用以下命令查找卷名称: docker volume ls 然后使用以下命令移除该卷: docker volume rm <volume name> 这将重新创建可能导致问题的卷。

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