Django + psycopg2 操作错误无法打开证书文件“/root/.postgresql/postgresql.crt”:权限被拒绝

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

我有一台 ubuntu 22 的服务器和 digitalocean 上的 postgres 数据库。我正在使用 docker swarm 部署 django 应用程序,当我尝试访问 /admin 页面时我收到此错误

connection to server at "xxxx.db.ondigitalocean.com" (xx.xxx.xxx.xx), port 25060 failed: could not open certificate file "/root/.postgresql/postgresql.crt": Permission denied

我要补充一点,当我创建一个测试脚本来连接到数据库以在服务器上进行测试时,一切正常,并且我可以从本地计算机连接到数据库。我在本地运行的同一个项目连接到数据库没有任何问题

数据库设置

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "dbname",
        "USER": "user",
        "PASSWORD": "pass",
        "HOST": "xxxx.db.ondigitalocean.com",
        "PORT": "25060",
    }
}

DOCKERFILE

FROM python:3.11

ARG GIT_ACCESS_TOKEN

RUN git config --global url."https://${GIT_ACCESS_TOKEN}@github.com".insteadOf "ssh://[email protected]"

WORKDIR /backend

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

COPY requirements.txt .
COPY entrypoint.sh .
COPY entrypoint-celery.sh .

# ADD /backend /backend
COPY /backend /backend

RUN python -m pip install -r requirements.txt

RUN mkdir -p /backend/tmp
RUN chmod -R 777 /backend/tmp

RUN mkdir -p /orders/xmls
RUN chmod -R 777 /orders/xmls
python django postgresql docker
2个回答
3
投票

有同样的错误,找到这个线程https://github.com/psycopg/psycopg2/issues/1535

我最终应用了这里建议的解决方法:https://github.com/nginx/unit/issues/834#issuecomment-1410297997

对于您的 dockerfile 只需添加以下内容

ENV PGSSLCERT /tmp/postgresql.crt

0
投票

我在 Kubernetes 上运行的 docker 容器中遇到了这个问题。容器正在与工人一起运行

gunicorn
。容器以 root 身份运行,但工作线程以
www-data
用户身份运行。因此,
$HOME
var 设置为
/root
,但
www-data
用户没有访问权限,因此出现权限问题。该文件在任一用户的
$HOME
目录中都不存在,但权限失败的处理方式与丢失文件不同。

将容器切换为以

www-data
用户身份运行也解决了该问题,因为
$HOME
变量现在指向用户有权访问的目录。

在 Dockerfile 中,可以显式设置用户

USER UID[:GID]

如果您无法在 Dockerfile 中设置用户(镜像在多个上下文中重用,需要不同的用户),许多工具允许您在运行时指定用户。

对于 Kubernetes,这意味着设置安全上下文

securityContext:
  runAsUser: <uid>
  runAsGroup: <gid>

对于原始 docker 命令,这可能意味着使用适当的标志

-u <uid>:<gid>

其他工具也有类似的机制。

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