首页 > 解决方案 > 如何将 Flask 与在 Docker 容器中运行的 Postgres 连接起来?

问题描述

我想将 Flask 后端与在单独的 docker 容器中运行的 Postgres 数据库连接起来。每次我尝试运行 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"]

应用程序.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")

我能做些什么来解决这个错误?

标签: pythonpostgresqldockerflask

解决方案


推荐阅读