繁体   English   中英

Docker 和 gunicorn 不会创建数据库表

[英]Docker and gunicorn doesn't' creates the tables of the database

这是我的 docker-compose 文件:

version: "3.7"
services:
  db:
    restart: always
    image: postgres:14-alpine
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: dinopedia
    volumes:
      - postgres_data:/var/lib/postgresql/postgres/data
    ports:
      - 5432:5432

  app:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    command: gunicorn --bind 0.0.0.0:8000 manage:app
    # command: python3 app.py run --host=0.0.0.0 --port=8000
    environment:
      FLASK_APP: app.py
      FLASK_ENV: docker
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      POSTGRES_DB: dinopedia
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 8000:8000
    volumes:
      - .:/app
    depends_on:
      - db

volumes:
  postgres_data:

这是日志:

dinopedia-app-1  |   File "/usr/local/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 208, in raise_
dinopedia-app-1  |     raise exception
dinopedia-app-1  |   File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1819, in _execute_context
dinopedia-app-1  |     self.dialect.do_execute(
dinopedia-app-1  |   File "/usr/local/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 732, in do_execute
dinopedia-app-1  |     cursor.execute(statement, parameters)
dinopedia-app-1  | sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "colour" does not exist
dinopedia-app-1  | LINE 2: FROM colour
dinopedia-app-1  |              ^
dinopedia-app-1  | 
dinopedia-app-1  | [SQL: SELECT count(%(count_2)s) AS count_1 
dinopedia-app-1  | FROM colour]
dinopedia-app-1  | [parameters: {'count_2': '*'}]
dinopedia-app-1  | (Background on this error at: https://sqlalche.me/e/14/f405)

sqlalchemy.exc.ProgrammingError:(psycopg2.errors.UndefinedTable)关系“颜色”不存在

但是其他命令一切正常:

command: python3 app.py run --host=0.0.0.0 --port=8000

我究竟做错了什么?

我用(app.py)解决了这个问题:

if __name__ == '__main__':
    app.app_context().push()
    db.create_all()
    app.run(host='0.0.0.0', port=8000)
else:
    # Creates the database and tables 
    # for the production environment    
    app.app_context().push()
    db.create_all()

我不知道这是否是正确的方法,但它的工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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