尝试连接数据库和 Web 容器时 SQL Alchemy 连接被拒绝

时间:2021-01-21 14:52:49

标签: python django docker docker-compose sqlalchemy

我在使用 django/postgres 应用程序(使用 sqlalchemy)运行 docker-compose up 时遇到问题。

在本地运行时一切都很好,但是当我尝试将它(使用 Docker)合并时,我遇到了一个错误:

<块引用>

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 无法连接到服务器:连接被拒绝。服务器是否在主机“127.0.0.1”上运行并接受端口 5432 上的 TCP/IP 连接`

由于某种原因,应用没有连接到数据库。

我的docker-compose.yml

version: "3.9"

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_DB=my database
      - POSTGRES_USER=my user
      - POSTGRES_PASSWORD=my password
  web:
    build: .
    command: python3 manage.py runserver 127.0.0.1:8080
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db

我的 Dockerfile:

FROM python:3

ENV PYTHONUNBUFFERED=1

WORKDIR /code

COPY requirements.txt /code/

RUN pip3 install --trusted-host pypi.python.org -r requirements.txt

COPY . /code/

我的引擎:

engine = create_engine("postgresql://my user:my password@127.0.0.1:5432/my database")

Django settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'my database',
        'USER': 'my user',
        'PASSWORD': 'my password',
        'HOST': '127.0.0.1',
        'PORT': 5432,
    }
}

谁能告诉我哪里出错了?

编辑

我尝试了 Max 的解决方案,但没有任何改变。我在错误引用中发现显示了我使用引擎的那一行。那么我应该以某种方式修改我的引擎吗?

1 个答案:

答案 0 :(得分:1)

我无法再次编辑我的评论。

因此,首先您需要将容器组合到一个 docker 网络中,see here。一个示例 docker-compose 看起来像这样:

version: "3.9"

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_DB=my database
      - POSTGRES_USER=my user
      - POSTGRES_PASSWORD=my password
    networks:
      - backend

  web:
    build: .
    command: python3 manage.py runserver 127.0.0.1:8080
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db
    networks:
      - backend


networks:
  backend:
    driver: bridge
    name: backend

然后你需要编辑你的django设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'my database',
        'USER': 'my user',
        'PASSWORD': 'my password',
        'HOST': '<your-service-name should be "db">',
        'PORT': 5432,
    }
}

在您当前的设置中,django 尝试连接到在同一容器中运行的数据库,但事实并非如此。

相关问题