Python Docker,Flask,SQLAlchemy:ValueError:以10为基数的int()的文本无效:';无';

Python Docker,Flask,SQLAlchemy:ValueError:以10为基数的int()的文本无效:';无';,python,postgresql,docker,flask,sqlalchemy,Python,Postgresql,Docker,Flask,Sqlalchemy,我有一个flask应用程序,可以成功初始化并连接到Postgresql数据库。但是,当我尝试将此应用程序dockerize时,会收到以下错误消息。“SQLALCHEMY\u DATABASE\u URI”是正确的,我可以连接到它,所以我不知道哪里出了问题 docker撰写日志 app_1 | File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/url.py", line 60, in __init__ ap

我有一个flask应用程序,可以成功初始化并连接到Postgresql数据库。但是,当我尝试将此应用程序dockerize时,会收到以下错误消息。“SQLALCHEMY\u DATABASE\u URI”是正确的,我可以连接到它,所以我不知道哪里出了问题

docker撰写日志

app_1       |   File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/url.py", line 60, in __init__
app_1       |     self.port = int(port)
app_1       | ValueError: invalid literal for int() with base 10: 'None'
Postgres数据库在Docker容器中成功连接

postgres_1  | LOG:  database system is ready to accept connections
config.py

from os import environ
import os

RDS_USERNAME = environ.get('RDS_USERNAME')
RDS_PASSWORD = environ.get('RDS_PASSWORD')
RDS_HOSTNAME = environ.get('RDS_HOSTNAME')
RDS_PORT = environ.get('RDS_PORT')
RDS_DB_NAME = environ.get('RDS_DB_NAME')

SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://{username}:{password}@{hostname}:{port}/{dbname}"\
                          .format(username = RDS_USERNAME, password = RDS_PASSWORD, \
                           hostname = RDS_HOSTNAME, port = RDS_PORT, dbname = RDS_DB_NAME)
烧瓶_app.py(入口点)

Dockerfile

FROM ubuntu

RUN apt-get update && apt-get -y upgrade

RUN apt-get install -y python-pip && pip install --upgrade pip

RUN mkdir /home/ubuntu

WORKDIR /home/ubuntu/celery-scheduler

ADD requirements.txt /home/ubuntu/celery-scheduler/

RUN pip install -r requirements.txt

COPY . /home/ubuntu/celery-scheduler

EXPOSE 5000

CMD ["python", "flask_app.py", "--host", "0.0.0.0"]
docker compose.yml

version: '2' 

services:
  app:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app
    depends_on:
      - postgres

  postgres:
    restart: always
      image: postgres:9.6
    environment:
      - POSTGRES_USER=${RDS_USERNAME}
      - POSTGRES_PASSWORD=${RDS_PASSWORD}
      - POSTGRES_HOSTNAME=${RDS_HOSTNAME}
      - POSTGRES_DB=${RDS_DB_NAME}
    ports:
      - "5432:5432"
services:
  app:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    environment:
      - RDS_USERNAME=${RDS_USERNAME}
      - RDS_PASSWORD=${RDS_PASSWORD}
      - RDS_HOSTNAME=${RDS_HOSTNAME}
      - RDS_DB_NAME=${RDS_DB_NAME}
    volumes:
      - .:/app
    depends_on:
      - postgres

例如,您需要在Dockerfile中使用
ENV key value
设置环境变量RDS\u USERNAME、RDS\u PASSWORD、RDS\u HOSTNAME、RDS\u PORT和RDS\u DB\u NAME

ENV RDS_PORT 5432
答复:

1) 使用变量定义创建一个.env文件(我假设env变量将从.bash_配置文件中“提取”,但事实并非如此……为了隐私起见,请记住将.env添加到.gitignore)

2) 在应用程序下的docker compose中指定环境变量

docker compose.yml

version: '2' 

services:
  app:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app
    depends_on:
      - postgres

  postgres:
    restart: always
      image: postgres:9.6
    environment:
      - POSTGRES_USER=${RDS_USERNAME}
      - POSTGRES_PASSWORD=${RDS_PASSWORD}
      - POSTGRES_HOSTNAME=${RDS_HOSTNAME}
      - POSTGRES_DB=${RDS_DB_NAME}
    ports:
      - "5432:5432"
services:
  app:
    restart: always
    build: 
      context: .
      dockerfile: Dockerfile
    environment:
      - RDS_USERNAME=${RDS_USERNAME}
      - RDS_PASSWORD=${RDS_PASSWORD}
      - RDS_HOSTNAME=${RDS_HOSTNAME}
      - RDS_DB_NAME=${RDS_DB_NAME}
    volumes:
      - .:/app
    depends_on:
      - postgres

起初我没有提到,但我已经有一个.env文件,其中包含变量的键值。(例如RDS_端口=5432)。即使在docker-compose.yml中为app指定'env_file:-'.env'也不起作用,如果用
CMD[“python”、“flask_-app.py”、“--host”、“0.0.0.0”]
替换
CMD[“env”]
,您可能会看到环境是否正常,以及问题是否是由于docker或与flask相关的东西在J.J.点上扩展造成的,您不需要更改Dockerfile——只需运行
docker compose exec app/bin/bash
。您可以通过应用程序流程查看环境。我也总是在
docker compose.yml
文件中显式设置
env_文件
,因为我的端口是空的'。你的意思是当前目录中有一个名为.env的文件保存了你的变量定义吗?RDS_用户名和其他?@Light.G没有。谢谢,添加一个带有变量定义的.env文件就是答案。此外,环境变量必须列在应用程序下