Azure部署Docker化Golang应用时Ping数据库超时及多容器配置报错
问题描述
问题1:Azure部署后数据库Ping超时
本地Docker环境下Golang应用可正常连接MariaDB,但部署到Azure Web App后出现数据库Ping超时,日志如下:
2023-04-04T02:08:47.385Z INFO - Waiting for response to warmup request for container app_0_cfbd4891. Elapsed time = 45.6099877 sec 2023-04-04T02:09:01.757899494Z 2023/04/04 02:09:01 ping db timed out
相关重试逻辑代码:
var PING_DB_ATTEMPTS = 60 func NewHandlerService(maria_repo maria_db.DbInterface, sugaredLogger *zap.SugaredLogger) (*HandlerService, error) { for i := 0; i < PING_DB_ATTEMPTS; i++ { if err := maria_repo.Ping(); err == nil { return &HandlerService{ maria_repo: maria_repo, sugaredLogger: sugaredLogger, }, nil } time.Sleep(time.Second) } return &HandlerService{}, errors.New("ping db timed out") }
问题2:多容器部署Yaml解析错误
按照Azure多容器教程部署时,出现Yaml解析失败,提示绑定挂载必须以${WEBAPP_STORAGE_HOME}开头,日志如下:
2023-04-06T23:37:07.751Z ERROR - Exception in multi-container config parsing: YamlException: (Line: 7, Col: 9, Idx: 73) - (Line: 7, Col: 9, Idx: 73): Bind mount must start with ${WEBAPP_STORAGE_HOME}. 2023-04-06T23:37:07.752Z ERROR - Start multi-container app failed
原docker-compose.yaml配置:
version: '3.7' services: api: build: context: . container_name: s-go ports: - 80:80 # 本地热重载挂载 volumes: - .:/s/ environment: - GIN_MODE=release depends_on: - maria-db condition: service_healthy maria-db: image: mariadb:10-focal container_name: s-maria-db command: '--default-authentication-plugin=mysql_native_password' restart: always healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"] interval: 3s retries: 5 start_period: 30s expose: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: "secret" MYSQL_DATABASE: "s_db" volumes: - db-data:/var/lib/mysql volumes: db-data:
解决方案
先解决Yaml解析错误
Azure App Service多容器部署对绑定挂载有强制限制:本地目录挂载(如.:/s/)不被允许,必须以${WEBAPP_STORAGE_HOME}开头,同时需修正Yaml语法错误。
修改后的docker-compose.yaml:
version: '3.7' services: api: build: context: . container_name: s-go ports: - 80:80 environment: - GIN_MODE=release depends_on: maria-db: condition: service_healthy maria-db: image: mariadb:10-focal container_name: s-maria-db command: '--default-authentication-plugin=mysql_native_password' restart: always healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"] interval: 3s retries: 5 start_period: 60s expose: - 3306 environment: MYSQL_ROOT_PASSWORD: "secret" MYSQL_DATABASE: "s_db" volumes: - db-data:/var/lib/mysql volumes: db-data:
修改点说明:
- 移除api服务中用于本地热重载的
- .:/s/挂载,生产环境无需该配置。 - 修正
depends_on的缩进错误,将condition缩进至maria-db节点下。 - 延长MariaDB的
start_period至60秒,适配Azure容器启动速度较慢的场景。 - 修正
expose配置(原"3306:3306"是端口映射,expose只需写内部端口3306)。
再解决数据库Ping超时
- 检查数据库连接地址:Azure多容器环境中,容器通过服务名通信,确保Golang应用的数据库连接字符串使用
maria-db:3306(而非127.0.0.1或localhost)。 - 增加Ping重试次数:将
PING_DB_ATTEMPTS从60调整为120(2分钟),给数据库足够的初始化时间。 - 验证数据库启动状态:部署后查看MariaDB容器日志,确认是否输出
ready for connections等初始化完成的日志。 - 核对环境变量:确保应用的数据库密码、数据库名等配置与
docker-compose.yaml中的MYSQL_ROOT_PASSWORD、MYSQL_DATABASE完全一致。
内容的提问来源于stack exchange,提问作者YouWontBreakMySoul
相关产品推荐
相关产品推荐

