Python Docker,Flask,SQLAlchemy:ValueError:以10为基数的int()的文本无效:';无';
我有一个flask应用程序,可以成功初始化并连接到Postgresql数据库。但是,当我尝试将此应用程序dockerize时,会收到以下错误消息。“SQLALCHEMY\u DATABASE\u URI”是正确的,我可以连接到它,所以我不知道哪里出了问题 docker撰写日志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
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文件就是答案。此外,环境变量必须列在应用程序下