Django,docker,PostGIS中的错误:服务器是否在本地运行并在Unix域套接字“ /var/run/postgresql/.s.PGSQL.5432”上接受连接?

时间:2020-07-20 05:36:56

标签: django postgresql docker docker-compose postgis

我有一个带PostGIS数据库的Django项目,需要对这个项目进行泊坞化。这就是我现在所拥有的。 在settings.py文件中:

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.postgis',
    'NAME': os.environ.get('pgdatabase'),
    'USER': os.environ.get('pguser'),
    'PASSWORD': os.environ.get('pgpassword'),
    'HOST': os.environ.get('pghostname'),
    'PORT': '5432',
}}

Dockerfile:

FROM python:2.7
WORKDIR /orion-amr/
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
RUN apt-get update
RUN apt-get install -y binutils libproj-dev gdal-bin
COPY . /orion-amr/

docker-compose.yml:

  version: '3'
  services:
    db:
      image: kartoza/postgis:12.0
      environment:
        - POSTGRES_DB=amr_or
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=root
      ports:
        - "5432:5432"
    web:
      build: ./
      command: bash -c "python manage.py migrate && python manage.py collectstatic --noinput --i rest_framework &&  gunicorn orion-amr.wsgi:application --bind 0.0.0.0:8000 --workers=2"
      ports:
        - "8000:8000"
      env_file:
        - ./.env.dev
      depends_on:
        - db

.env.dev:

SECRET_KEY=z)mf(y#w7-_8y1)0(v*n@w@lzf)!0=g_rj5$%1w6g-t!7nbk05
PGDATABASE=amr_or
PGPASSWORD=root
PGHOSTNAME=db
PGUSER=postgres
DEBUG=

现在数据库服务可以正常工作,但是Web服务会引发此错误:

django.db.utils.OperationalError: could not connect to server: No such file or directory

Is the server running locally and accepting

connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我尝试了许多解决方案(添加“ sleep 10”或更改音量等),但对我没有任何帮助。何能帮助我吗?

1 个答案:

答案 0 :(得分:1)

如评论中所述,您需要在ENV中使用大写字母。

    'USER': os.environ.get('postgres'),
    'PASSWORD': os.environ.get('PGPASSWORD'),
    'HOST': os.environ.get('PGHOSTNAME'),

或者另一个选择是使用硬编码值进行调试以验证连接。

    'USER': "postgres"
    'PASSWORD':"root",
    'HOST': "db",

尝试连接到数据库时出现错误,例如用户名,密码或数据库名。检查它们是否是postgres要求您连接的对象,并且这是您要访问的db_name。

django.db.utils.OperationalError Could not connect to server