You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

修改点说明:

  1. 移除api服务中用于本地热重载的- .:/s/挂载,生产环境无需该配置。
  2. 修正depends_on的缩进错误,将condition缩进至maria-db节点下。
  3. 延长MariaDB的start_period至60秒,适配Azure容器启动速度较慢的场景。
  4. 修正expose配置(原"3306:3306"是端口映射,expose只需写内部端口3306)。

再解决数据库Ping超时

  1. 检查数据库连接地址:Azure多容器环境中,容器通过服务名通信,确保Golang应用的数据库连接字符串使用maria-db:3306(而非127.0.0.1或localhost)。
  2. 增加Ping重试次数:将PING_DB_ATTEMPTS从60调整为120(2分钟),给数据库足够的初始化时间。
  3. 验证数据库启动状态:部署后查看MariaDB容器日志,确认是否输出ready for connections等初始化完成的日志。
  4. 核对环境变量:确保应用的数据库密码、数据库名等配置与docker-compose.yaml中的MYSQL_ROOT_PASSWORD、MYSQL_DATABASE完全一致。

内容的提问来源于stack exchange,提问作者YouWontBreakMySoul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:32:13