Azure中Docker Compose部署SteVe OCPP服务无法连接数据库如何解决?
故障排查与解决
核心原因
你本地Docker环境支持已废弃的links配置项,所以"db:mariadb"的主机别名可以正常生效。但Azure ACI的Docker Compose实现完全不支持links参数,导致web容器无法解析mariadb主机名,出现你看到的DNS查询失败报错。
修复方案
方案1:适配镜像默认配置(改动最小)
直接将数据库服务名改为mariadb,无需修改镜像内部的数据库连接参数,修改后的Docker Compose配置如下:
version: "3.0" volumes: db-data: external: false services: mariadb: image: mariadb:10.4 ports: - 3306:3306 volumes: - db-data:/var/lib/mysql environment: MYSQL_RANDOM_ROOT_PASSWORD: "yes" MYSQL_DATABASE: stevedb MYSQL_USER: steve MYSQL_PASSWORD: changeme web: image: rainmakers/steve:latest ports: - 8180:8180 - 8443:8443 depends_on: - mariadb environment: MYSQL_PASSWORD: changeme
方案2:显式指定数据库主机地址
如果不想改动数据库服务名,可通过环境变量覆盖web服务的默认数据库连接地址,修改web服务配置即可:
web: image: rainmakers/steve:latest ports: - 8180:8180 - 8443:8443 depends_on: - db environment: # 显式指定数据库主机为db服务名 DB_HOST: db MYSQL_PASSWORD: changeme
额外注意事项
- ACI中同个Docker Compose部署的所有服务,默认可以直接用服务名作为主机名互相访问,不需要额外配置
depends_on仅控制容器启动顺序,不会等待数据库进程完全就绪,若修改后仍偶现连接失败,可给web服务添加启动等待逻辑,等3306端口可访问后再启动主进程links属于Docker官方已废弃的特性,所有云厂商的容器服务基本都不支持该配置,后续不要在生产配置中使用
内容的提问来源于stack exchange,提问作者Oystein
相关产品推荐
相关产品推荐

