docker 创建容器化flask + next.js + postgres应用程序的问题

roejwanj  于 2023-03-01  发布在  Docker
关注(0)|答案(1)|浏览(123)

我一直在尝试容器化我的React前端、Flask后端和Postgres应用程序,但是我遇到了很多问题,现在的主要问题是我的Postgres模式没有被正确加载。
下面是我的目录结构:
Directory structure.
下面是我的compose.yaml

services:
  database:
    image: postgres:latest
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=admin
    ports:
      - "5432:5432"
    volumes:
      - data:/var/lib/postgresql/data
      - ./database/1-schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
      - ./database/2-init.sql:/docker-entrypoint-initdb.d/02-init.sql

volumes:
  data:

下面是我的两个SQL脚本:
1-schema.sql

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
);

2-init.sql

INSERT INTO users (username) VALUES ("John Doe");
INSERT INTO users (username) VALUES ("Jane Doe");

flask 应用程序的Dockerfile不再工作了,所以我没有麻烦包括它。
下面是我的app.py

from flask import Flask
import psycopg2

app = Flask(__name__)

@app.route("/api")
def index():
    conn = psycopg2.connect("postgresql://postgres:admin@localhost:5432/postgres")

    cursor = conn.cursor()

    cursor.execute("SELECT * FROM users;")
    result = cursor.fetchone()

    conn.commit()
    conn.close()

    return result

当我运行docker-compose up时,我收到以下错误消息:
psql:/docker-entrypoint-initdb.d/01-schema.sql: error: could not read from input file: Is a directory
exited with code 1
下面是完整的输出:
Output-1Output-2
然后当我试图访问app.py中的查询结果时,通过转到http://127.0.0.1:5000/api,我得到一个错误,说关系不存在:
Flask Output
数据库成功接收到查询,但也指出关系不存在:
ERROR: relation "users" does not exist at character 15
STATEMENT: SELECT * FROM users;
希望能得到一些指导,说明这里出了什么问题,以及如何将我的Flask后端和Next.js前端容器化。

5cg8jx4n

5cg8jx4n1#

罪魁祸首应该是合成文件的以下部分:

volumes:
  - data:/var/lib/postgresql/data
  - ./database/1-schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
  - ./database/2-init.sql:/docker-entrypoint-initdb.d/02-init.sql

正如this other answer还指出的,如果您试图挂载的文件不存在,docker将在容器内创建一个空目录,因此错误消息“is a directory”(是一个目录)。
请验证文件是否存在,路径是否正确,并尝试将相对路径替换为绝对路径。如果这也不起作用,请尝试挂载整个目录,如下所示:

- ./database/:/docker-entrypoint-initdb.d/

相关问题