简体   繁体   中英

Why is my flask server unable to speak to the postgres database using docker-compose?

I have posted the relevant files below. Everything builds as expected, however when trying to use SQLAlchemy to make a call to the database, I invariably get the following error:

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

The string that sqlalchemy is using is (as given in .env.web.dev): postgres://postgres:postgres@db:5432/spaceofmotion .

What am I doing wrong?

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> ...

Is this specifically coming from your celery container?

Your db container declares

networks:
  - db_web

but the celery container has no such declaration; that means that it will be on the default network Compose creates for you . Since the two containers aren't on the same network they can't connect to each other.

There's nothing wrong with using the Compose-managed default network, especially for routine Web applications, and I'd suggest deleting all of the networks: blocks in the entire file. (You also don't need to specify container_name: , since Compose will come up with reasonable names on its own.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM