我正在尝试从 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
时出现权限错误。也许我忘记了一些愚蠢的事情?
docker-compose-postgres
存储库存在几个问题,这使得它不是一个很好的例子,首先它使用绑定安装来存储而不是命名卷。只是简单地指出所有问题:
通过使用绑定安装而不是命名卷,访问由本地目录的所有权和权限控制。这通常会导致冲突,并且在这种情况下没有充分的理由(因为没有令人信服的理由表明您需要直接访问 postgres 或 pgadmin 后端存储)。
我强烈怀疑您的权限问题是由于使用绑定安装造成的,并且我认为用命名卷替换这些问题将解决您的问题。我无法访问 WSL 环境来测试这个理论。
您不需要显式创建由撰写文件中的服务共享的网络;
docker compose
默认情况下会为您做到这一点。
我认为这不是使用
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
文件中的变量。