Почему мой flask сервер не может общаться с базой данных postgres с помощью docker -compose? - PullRequest
1 голос
/ 06 января 2020

Я разместил соответствующие файлы ниже. Все строится, как и ожидалось, однако при попытке использовать SQLAlchemy для вызова базы данных я всегда получаю следующую ошибку:

OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known

Строка, которую использует sqlalchemy: (as указано в .env.web.dev): postgres://postgres:postgres@db:5432/spaceofmotion.

Что я делаю не так?

docker -compose.yml:

version: '3'

services:
  db:
    container_name: db
    ports:
      - '5432:5432'
    expose:
      - '5432'
    build:
      context: ./
      dockerfile: Dockerfile.postgres
    networks:
      - db_web

  web:
    container_name: web
    restart: always
    build:
      context: ../
      dockerfile: Dockerfile.web
    ports:
      - '5000:5000'
    env_file:
      - ./.env.web.dev
    networks:
      - db_web
    depends_on:
      - db
      - redis
      - celery

  redis:
    image: 'redis:5.0.7-buster'
    container_name: redis
    command: redis-server
    ports:
      - '6379:6379'

  celery:
    container_name: celery
    build:
      context: ../
      dockerfile: Dockerfile.celery
    env_file:
      - ./.env.celery.dev
    command: celery worker -A a.celery --loglevel=info
    depends_on:
      - redis

  client:
    container_name: react-app
    build:
      context: ../a/client
      dockerfile: Dockerfile.client
    volumes:
      - '../a/client:/src/app'
      - '/src/app/node_modules'
    ports:
      - '3000:3000'
    depends_on:
      - "web"
    environment:
      - NODE_ENV=development
      - HOST_URL=http://localhost:5000

networks:
  db_web:
    driver: bridge

Dockerfile . postgres:

FROM postgres:latest

ENV POSTGRES_DB spaceofmotion
ENV POSTGRES_USER postgres
ENV POSTGRES_PASSWORD postgres

COPY ./spaceofmotion-db.sql /
COPY ./docker-entrypoint-initdb.d/restore-database.sh /docker-entrypoint-initdb.d/

restore-database. sh:

file="/spaceofmotion-db.sql"
psql -U postgres spaceofmotion < "$file"

Dockerfile.web:

FROM python:3.7-slim-buster

RUN apt-get update
RUN apt-get -y install python-pip libpq-dev python-dev && \
    pip install --upgrade pip && \
    pip install psycopg2

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

COPY . /app
WORKDIR /app

RUN pip install -r requirements.txt

CMD ["python", "manage.py", "runserver"]

.env.web.dev :

DATABASE_URL=postgres://postgres:postgres@db:5432/spaceofmotion
... <other config vars> ...

1 Ответ

0 голосов
/ 06 января 2020

Это определенно исходит от вашего celery контейнера?

Ваш db контейнер объявляет

networks:
  - db_web

, но контейнер celery не имеет такого объявления; это означает, что будет в сети default, которую Compose создает для вас . Поскольку два контейнера не находятся в одной сети, они не могут соединяться друг с другом.

Нет ничего плохого в использовании управляемой Compose сети default, особенно для обычных веб-приложений, и я бы хотел предложить удалить все блоки networks: во всем файле. (Вам также не нужно указывать container_name:, так как Compose сам придумает разумные имена.)

...