mysql - Docker 为烧瓶应用程序编写数据库 url 环境变量
问题描述
尝试使用 docker-compose.yml 而不是像这样单独启动容器:
docker container run --name mysql -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes -e MYSQL_DATABASE=currency -e MYSQL_USER=currency -e MYSQL_PASSWORD=currency mysql/mysql-server:5.7
docker run --name currency -d -p 8000:5000 --rm --link mysql:dbserver -e DATABASE_URL=mysql+pymysql://currency:currency@dbserver/currency currency:latest
单独运行时,flask 应用程序会正确找到 DATABASE_URL 并使用 mysql db。
我使用的 docker-compose.yml 文件如下:
version: "2"
services:
mysql:
image: mysql/mysql-server:5.7
environment:
- MYSQL_RANDOM_ROOT_PASSWORD:yes
- MYSQL_DATABASE:currency
- MYSQL_USER:currency
- MYSQL_PASSWORD:currency
currency:
build: .
links:
- "mysql:dbserver"
ports:
- "8000:5000"
environment:
- DATABASE_URL:"mysql+pymysql://currency:currency@dbserver/currency"
当我使用 docker-compose.yml 时,它没有使用 mysql 数据库。我相信对于 docker-compose.yml 中的一些错误,烧瓶应用程序无法看到环境变量“DATABASE_URL”。docker-compose.yml 出了什么问题?
解决方案
第一:确保不使用链接
该
--link
标志是 Docker 的遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信,而不是使用--link
.
用户定义的网络不支持您可以使用 --link 执行的一项功能是在容器之间共享环境变量。但是,您可以使用其他机制(例如卷)以更可控的方式在容器之间共享环境变量。
其次,docker exec -it currency bash
在您的货币容器中打开一个会话,并echo "DATABASE_URL='${DATABASE_URL}'"
在其中执行一个操作,以检查环境变量是否已设置。
最后,检查您的情况是否是订购问题(在数据库完全启动之前开始的货币)
请参阅“在 Compose 中控制启动顺序”。
例如:
version: "2"
services:
web:
build: .
ports:
- "80:8000"
depends_on:
- "db"
command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
db:
image: postgres
推荐阅读
- reactjs - ReactJS:过滤操作
- flutter - 无论如何检测应用程序关闭颤振?
- sql - 如何从具有共同词的 2 个不同列中选择元素
- mongodb - Mongoose - 在子文档数组中查找一个项目以及该数组中的整个总数
- html - 页脚不触及底部,如果绝对它隐藏内容?
- python - 如何在不定义数据库类的情况下从 SQLAlchemy 访问给定的 Oracle 表
- javascript - React.js - 通过组件传递函数 - “handleChange 不是函数”
- vb.net - 创建一个程序来确定输入数据是否为日期
- javascript - 如何在产品价格后删除 ISO 代码(Shopify)
- amazon-web-services - 是否可以使用 aws cloud watch logs 洞察在匹配正则表达式的消息之前显示 n 条消息