如何解决部署为Azure Web应用程序时,多容器Flask应用程序无法连接到mysql数据库
我有一个容器化的Flask应用程序,可以使用docker-compose在我的机器上完美运行。部署到Azure应用程序服务时,同一应用程序无法运行。这是在我的机器上运行的设置:
docker-compose.yml
:
version: '3'
services:
app:
build: .
ports:
- 8000:5000
env_file: .env
restart: always
links:
- mysql:dbserver
mysql:
image: mysql/mysql-server:5.7
env_file: .env-mysql
restart: always
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
.env和.env-mysql文件包含各种环境变量。这里重要的一个是DATABASE_URL
用于在sqlalchemy
文件中建立数据库连接的config.py
变量,该变量设置为以下内容(已修改以删除敏感信息):
DATABASE_URL=mysql+pymysql://appuser:testpw@dbserver/appdb
使用Azure应用服务部署时,相同的docker-compose.yml
文件不起作用。基于this tutorial和this stackoverflow answer,Azure似乎对docker-compose具有某些关键字限制,并且不允许使用links
。因此,根据他们的示例,我的生产版本撰写文件被修改为如下所示:
docker-compose.yml
version: '3'
services:
db:
image: mysql/mysql-server:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
app:
depends_on:
- db
image: amyapp.azurecr.io/myapp:latest
ports:
- 8000:5000
restart: always
volumes:
db_data:
我在App Service的配置中设置了所有各种环境变量,并且mysql映像和我的自定义应用程序映像(托管在Azure容器注册表中)都已成功提取。的
DATABASE_URL
变量设置与上述相同。当我尝试运行该应用程序时,在容器日志中看到它引发以下错误:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003,"Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)")
这使我相信,当您使用links
时,会发生某些事情,该问题允许将连接字符串中的服务器名称设置为链接数据库名称。使用depends_on
时似乎不是这种情况,因此服务器名称无法正确解析。我尝试了多个修复程序均未成功,并且尝试使数据库端口混乱,等等。到目前为止,没有任何进展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。