如何解决 Linux 的 Windows 子系统的 laradock 中的 "Operation not permitted: '/var/lib/pgadmin'" 错误?

How to solve "Operation not permitted: '/var/lib/pgadmin'" error in laradock at Windows Subsystem for Linux?

我在我的 Laravel 项目中使用 Laradock 与 Nginx、Postgres 和 Pgadmin 进行 dockerizing。所有容器都 运行ning 很好,但 Pgadmin 无法这样做。这是我的错误日志,

pgadmin_1              | WARNING: Failed to set ACL on the directory containing the configuration database: [Errno 1] Operation not permitted: '/var/lib/pgadmin'
pgadmin_1              | Traceback (most recent call last):
pgadmin_1              |   File "run_pgadmin.py", line 4, in <module>
pgadmin_1              |     from pgAdmin4 import app
pgadmin_1              |   File "/pgadmin4/pgAdmin4.py", line 92, in <module>
pgadmin_1              |     app = create_app()
pgadmin_1              |   File "/pgadmin4/pgadmin/__init__.py", line 241, in create_app
pgadmin_1              |     create_app_data_directory(config)
pgadmin_1              |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 40, in create_app_data_directory
pgadmin_1              |     _create_directory_if_not_exists(config.SESSION_DB_PATH)
pgadmin_1              |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 16, in _create_directory_if_not_exists
pgadmin_1              |     os.mkdir(_path)
pgadmin_1              | PermissionError: [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
pgadmin_1              | sudo: setrlimit(RLIMIT_CORE): Operation not permitted
pgadmin_1              | [2020-06-07 11:48:43 +0000] [1] [INFO] Starting gunicorn 19.9.0
pgadmin_1              | [2020-06-07 11:48:43 +0000] [1] [INFO] Listening at: http://[::]:80 (1)
pgadmin_1              | [2020-06-07 11:48:43 +0000] [1] [INFO] Using worker: threads
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-06-07 11:48:43 +0000] [83] [INFO] Booting worker with pid: 83
pgadmin_1              | [2020-06-07 11:48:44 +0000] [83] [ERROR] Exception in worker process
pgadmin_1              | Traceback (most recent call last):
pgadmin_1              |   File "/usr/local/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
pgadmin_1              |     worker.init_process()
pgadmin_1              |   File "/usr/local/lib/python3.8/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.8/site-packages/gunicorn/workers/base.py", line 129, in init_process
pgadmin_1              |     self.load_wsgi()
pgadmin_1              |   File "/usr/local/lib/python3.8/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.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
pgadmin_1              |     self.callable = self.load()
pgadmin_1              |   File "/usr/local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
pgadmin_1              |     return self.load_wsgiapp()
pgadmin_1              |   File "/usr/local/lib/python3.8/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.8/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 92, in <module>
pgadmin_1              |     app = create_app()
pgadmin_1              |   File "/pgadmin4/pgadmin/__init__.py", line 241, in create_app
pgadmin_1              |     create_app_data_directory(config)
pgadmin_1              |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 40, in create_app_data_directory
pgadmin_1              |     _create_directory_if_not_exists(config.SESSION_DB_PATH)
pgadmin_1              |   File "/pgadmin4/pgadmin/setup/data_directory.py", line 16, in _create_directory_if_not_exists
pgadmin_1              |     os.mkdir(_path)
pgadmin_1              | PermissionError: [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
pgadmin_1              | [2020-06-07 11:48:44 +0000] [83] [INFO] Worker exiting (pid: 83)
pgadmin_1              | WARNING: Failed to set ACL on the directory containing the configuration database: [Errno 1] Operation not permitted: '/var/lib/pgadmin'
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-06-07 11:48:44 +0000] [1] [INFO] Shutting down: Master
pgadmin_1              | [2020-06-07 11:48:44 +0000] [1] [INFO] Reason: Worker failed to boot.

我尝试了很多方法来解决这个问题。例如,

https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html

和其他一些 github 问题及其解决方案。我也运行 sudo chmod -R 777 ~/.laradock/data/pgadminsudo chmod -R 777 /var/lib/pgadmin 命令获得权限但仍然是相同的错误日志。你们能帮我吗?我认为其他一些人也在他们的本地机器上遇到了这个错误。 谢谢

我能提供的唯一解决方案是使用

登录容器
docker-compose exec --user root pgadmin sh

然后

chmod 0777 /var/lib/pgadmin -R

可能最好提前从 dpage/pgadmin4 和 运行 这些命令创建自己的 dockerfile。

你可以试试这个:

sudo chown -R 5050:5050 ~/.laradock/data/pgadmin

然后重启容器。原因在容器中:

uid=5050(pgadmin) gid=5050(pgadmin)

drwx------ 4 pgadmin  pgadmin  56 Jan 27 08:25 pgadmin

正如其他人在上面指出的那样,我发现 说明了持久性本地文件夹没有正确用户权限的挑战。

运行 sudo chown -R 5050:5050 ~/.laradock/data/pgadmin 并重新启动容器后,我的日志中不再出现以下错误

PermissionError: [Errno 13] Permission denied:

使用 Kubernetes 和来自 https://github.com/rowanruseler/helm-charts 的 pgadmin4 helm chart 时会发生类似的错误。

解决方法是设置:

VolumePermissions:
  enabled: true

即使未启用持久性。通过这种方式,容器中的 /var/lib/pgadmin 文件夹也被分配了正确的权限,并且可以正确创建 pgadmin4.db 数据库。

假设您的 pgadmin4.db 文件夹已经在您的 git 存储库中与 pgadmin 以外的其他用户一起定义,您可以这样做:

postgres_interface:
  image: dpage/pgadmin4
  environment:
    - PGADMIN_DEFAULT_EMAIL=user@domain.com
    - PGADMIN_DEFAULT_PASSWORD=postgres
  ports:
    - "5050:80"
  user: root
  volumes:
    - ./env/local/pgadmin/pgadmin4.db:/pgadmin4.db
     entrypoint: /bin/sh -c "cp /pgadmin4.db /var/lib/pgadmin/pgadmin4.db && cd /pgadmin4 && /entrypoint.sh"