尝试使用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中存在一些错误,flask应用无法看到环境变量“ DATABASE_URL”。 docker-compose.yml中出了什么问题?
答案 0 :(得分:0)
首先:确保不使用 links
--link
标志是Docker的旧功能。它最终可能会被删除。除非您绝对需要继续使用它,否则建议您使用 user-defined networks 来促进两个容器之间的通信,而不要使用--link
。
用户定义的网络不支持您使用--link进行的一项功能是在容器之间共享环境变量。但是,您可以使用其他机制(例如卷)以更可控的方式在容器之间共享环境变量。
第二,执行docker exec -it currency bash
在您的货币容器中打开一个会话,并在其中进行echo "DATABASE_URL='${DATABASE_URL}'"
,以检查是否已设置环境变量。
最后,检查您的情况是否是订购问题(币种在之前数据库已完全启动)
请参阅“ Control startup order in 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