如何将Flask与在Docker容器中运行的Postgres连接?

时间:2019-07-23 13:30:40

标签: python postgresql docker flask

我想将Flask后端与Postgres数据库连接,两者都在单独的Docker容器中运行。每次我尝试运行app.py时,都会出现错误消息

  

ModuleNotFoundError:没有名为“ psycopg2”的模块

我只想保存一些结果,作为神经网络的输出。

这是我的docker-compose.yml:

version: "3.5"

services:

  react-dev:
    container_name: 'frontend_container'
    build:
      context: ./ta_frontend
      dockerfile: Dockerfile
    volumes:
      - './ta_frontend:/usr/src/app'
      - '/usr/src/app/node_modules'
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=development

  postgres:
    image: 'postgres:11'
    container_name: 'postgres_container'
    ports:
      - '54320:5432'
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres-data:/var/lib/postgresql/data

  pgadmin:
    image: 'dpage/pgadmin4'
    container_name: 'pgadmin_container'
    ports:
      - '5050:80'
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
    depends_on:
      - postgres

  backend:
    container_name: 'backend_container'
    restart: always
    build: ./ta_backend
    ports:
      - "5000:5000"
    volumes:
      - ./ta_backend:/usr/src/app

volumes:
  postgres-data:

后端容器的Dockerfile:

FROM python:3.7-alpine

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

COPY . /usr/src/app/

RUN apk update && \
 apk add postgresql-libs && \
 apk add --virtual .build-deps gcc musl-dev postgresql-dev && \
 python -m pip install -r requirements.txt --no-cache-dir && \
 apk --purge del .build-deps

EXPOSE 5000

CMD ["python", "app.py"]

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:example@postgres_container/postgres'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False


db = SQLAlchemy(app)


class Result(db.Model):
    id = db.Column('result_id', db.Integer, primary_key=True)
    cars = db.Column(db.SmallInteger)
    trucks = db.Column(db.SmallInteger)
    busses = db.Column(db.SmallInteger)
    motorcycles = db.Column(db.SmallInteger)

    def __init__(self, cars, trucks, busses, motorcycles):
        self.cars = cars
        self.trucks = trucks
        self.busses = busses
        self.motorcycles = motorcycles


@app.route("/")
def hello_docker() -> str:
    return "Backend listening on Port 5000."


if __name__ == "__main__":
    db.create_all()
    test_rec = Result(
        5,
        1,
        1,
        2
    )
    db.session.add(test_rec)
    db.session.rollback()
    db.session.commit()
    app.run(debug=True, host="0.0.0.0")

我该怎么办才能解决该错误?

0 个答案:

没有答案