Docker 撰写、Postgres/PGAdmin 设置

问题描述 投票:0回答:1

我正在尝试从 https://trpc.io/docs/example-apps 获取示例应用程序来工作。问题是我想在 docker 中运行数据库,因为我使用 Windows Subsystem for Linux (WSL2) Ubuntu 环境。它使用 postgres。这是一台相当新的机器,我知道我过去在纯 Linux 中做过这个。

我本来希望使用它,因为乍一看它看起来不错: https://github.com/felipewom/docker-compose-postgres.git

我的完整代码在这里:https://github.com/ScorpIan555/simple-trpc-w-app-router 有一些细微的修改,但我能够在 Felipe 的示例存储库以及我自己的示例存储库中复制这个完全相同的错误。

.env

DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DB=postgres
PGADMIN_DEFAULT_EMAIL=[xxx]@gmail.com
PGADMIN_DEFAULT_PASSWORD=password

错误信息:

2023-12-30 07:30:49 [2023-12-30 12:30:49 +0000] [93] [INFO] Booting worker with pid: 93
2023-12-30 07:30:51 [2023-12-30 12:30:51 +0000] [93] [INFO] Worker exiting (pid: 93)
2023-12-30 07:30:51 ERROR  : Failed to create the directory /var/lib/pgadmin/sessions:
2023-12-30 07:30:51            [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
2023-12-30 07:30:51 HINT   : Create the directory /var/lib/pgadmin/sessions, ensure it is writeable by
2023-12-30 07:30:51          'pgadmin', and try again, or, create a config_local.py file
2023-12-30 07:30:51          and override the SESSION_DB_PATH setting per
2023-12-30 07:30:51          https://www.pgadmin.org/docs/pgadmin4/8.1/config_py.html
2023-12-30 07:30:51 [2023-12-30 12:30:51 +0000] [94] [INFO] Booting worker with pid: 94

我知道 /var/lib/ 目录归 root 所有。我对 pgadmin 不太了解,但看起来 postgres db 协议(?)可能会在容器运行后尝试在容器中设置会话,这是预期的行为。

考虑到容器文件系统应该是只读的,我试图按照错误消息创建

config_local.py
文件,但当我设置 Dockerfile 并执行
RUN touch config_local.py
时出现权限错误。也许我忘记了一些愚蠢的事情?

postgresql docker docker-compose pgadmin
1个回答
0
投票

我认为

docker-compose-postgres
存储库存在几个问题,这使得它不是一个很好的例子,首先它使用绑定安装来存储而不是命名卷。只是简单地指出所有问题:

  1. 通过使用绑定安装而不是命名卷,访问由本地目录的所有权和权限控制。这通常会导致冲突,并且在这种情况下没有充分的理由(因为没有令人信服的理由表明您需要直接访问 postgres 或 pgadmin 后端存储)。

    我强烈怀疑您的权限问题是由于使用绑定安装造成的,并且我认为用命名卷替换这些问题将解决您的问题。我无法访问 WSL 环境来测试这个理论。

  2. 您不需要显式创建由撰写文件中的服务共享的网络;

    docker compose
    默认情况下会为您做到这一点。

  3. 我认为这不是使用

    env-file
    选项的好例子。由于文件本身只是引用其他环境变量,因此它只是另一个间接点。我们可以使用 compose 对
    .env
    的默认支持来获得更好的效果。

我可能会重写该文件,使其看起来像这样:

services:
  database:
    image: 'docker.io/postgres:latest'
    environment:
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
    ports:
      - 15432:5432
    volumes:
      - pg-data:/var/lib/postgresql/data/
 
  pgadmin:
    image: 'docker.io/dpage/pgadmin4:latest'
    environment:
      PGADMIN_DEFAULT_EMAIL: "${PGADMIN_DEFAULT_EMAIL}"
      PGADMIN_DEFAULT_PASSWORD: "${PGADMIN_DEFAULT_PASSWORD}"
    ports:
      - 15080:80
    volumes:
      - pgadmin-data:/var/lib/pgadmin/

volumes:
  pg-data:
  pgadmin-data:

如果您创建一个看起来像这样的

.env

POSTGRES_PASSWORD=secret
[email protected]
PGADMIN_DEFAULT_PASSWORD=secret

并提出这样的问题:

docker compose up

然后 docker 将自动应用您的

.env
文件中的变量。

© www.soinside.com 2019 - 2024. All rights reserved.