Golang Web应用部署到Azure的最佳实践是什么

Golang Web应用部署到Azure的最佳实践是什么 我已经花了三天时间尝试将我的简单 Go 语言 Web 应用程序部署到 Azure。我尝试在 Docker 中构建容器并部署到 Azure,但没有成功。我也尝试使用本地 Git 部署到 Azure,同样没有成功。这是该 Web 应用程序的链接:https://github.com/AOhassan/GoSystemOfEquations。需要帮助,提前感谢,我非常感激。

5 回复

你能展示一下如何部署一个简单的 Golang Web 应用程序吗?

更多关于Golang Web应用部署到Azure的最佳实践是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢,我吃完饭就试试。有进展会及时告知。

仍然无法正常工作。有没有更简单的方法可以在 Azure 上使用我的 git 仓库来实现这个?

你好

查看了你的Dockerfile,它应该无法正常工作。它只是下载了一些包,没有做其他事情。

FROM golang:latest
MAINTAINER ahmedhosman@live.com
RUN mkdir /app
COPY . /app
RUN apt -y update && apt -y install git
RUN go get github.com/gosimple/slug
RUN go get github.com/gin-gonic/gin
RUN go get gopkg.in/russross/blackfriday.v2
RUN go get github.com/gin-gonic/contrib/sessions
WORKDIR /app

请按照这些说明操作:https://medium.com/@chemidy/create-the-smallest-and-secured-golang-docker-image-based-on-scratch-4752223b7324,并使用两阶段构建来构建你的应用。首先使用一个镜像来编译它,然后使用一个最小化的镜像来运行它。

以下是针对将您的 Go Web 应用部署到 Azure 的最佳实践和具体步骤。我将基于您的 GitHub 仓库(GoSystemOfEquations)中的代码提供示例,帮助您成功部署。您的应用是一个简单的 Web 服务器,使用标准库处理 HTTP 请求,因此部署过程应相对直接。

最佳实践概述

  • 使用 Azure App Service(Linux 容器):这是部署 Go Web 应用的推荐方式,因为它支持自定义 Docker 容器,易于扩展和管理。
  • 构建优化的 Docker 镜像:使用多阶段构建以减少镜像大小,并确保 Go 模块依赖正确安装。
  • 配置环境变量和端口:在 Azure 中设置必要的环境变量,如端口(默认为 8080 用于 Go Web 应用)。
  • 利用 Azure CLI 或 GitHub Actions 实现自动化部署:简化部署流程,减少手动错误。

步骤 1:修复和优化您的 Go 应用代码

首先,检查您的 GitHub 仓库代码。您的 main.go 文件看起来正确,但确保它监听正确的端口(例如 8080,这是 Azure App Service 的默认端口)。如果您的代码使用其他端口,请在 Azure 中配置 WEBSITES_PORT 环境变量。

示例 main.go 代码(基于您的仓库,但已简化以展示关键部分):

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Go Web App is running on Azure!")
    })

    port := os.Getenv("PORT")
    if port == "" {
        port = "8080" // 默认端口用于 Azure
    }
    log.Printf("Server starting on port %s", port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

关键点:使用 os.Getenv("PORT") 来获取 Azure 提供的端口,这确保应用在 Azure 环境中正确绑定。

步骤 2:创建 Dockerfile 用于容器化部署

在您的项目根目录创建一个 Dockerfile,使用多阶段构建以生成轻量级镜像。以下是针对您的应用的示例 Dockerfile:

# 第一阶段:构建 Go 应用
FROM golang:1.21-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# 第二阶段:运行阶段
FROM alpine:latest

RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .

EXPOSE 8080
CMD ["./main"]

这个 Dockerfile 使用 Alpine Linux 作为基础镜像,减少大小,并通过多阶段构建分离构建和运行环境。

构建并测试 Docker 镜像本地:

docker build -t go-web-app .
docker run -p 8080:8080 go-web-app

访问 http://localhost:8080 确认应用运行正常。

步骤 3:部署到 Azure App Service

使用 Azure CLI 或 Azure 门户部署 Docker 容器。以下是使用 Azure CLI 的步骤:

  1. 安装 Azure CLI(如果尚未安装):从 Azure CLI 官网 下载并安装。

  2. 登录 Azure

    az login
    
  3. 创建资源组和 App Service 计划(如果不存在):

    az group create --name myResourceGroup --location eastus
    az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku B1 --is-linux
    
  4. 创建 Web App 并部署 Docker 镜像

    az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name myGoWebApp --deployment-container-image-name go-web-app
    

    如果您已将镜像推送到 Docker Hub 或 Azure Container Registry,使用完整镜像路径,例如 dockerhubusername/go-web-app:latest

  5. 设置环境变量(如果需要):

    az webapp config appsettings set --resource-group myResourceGroup --name myGoWebApp --settings WEBSITES_PORT=8080
    

    这确保应用使用正确端口。

  6. 获取应用 URL 并测试

    az webapp show --resource-group myResourceGroup --name myGoWebApp --query defaultHostName --output tsv
    

    访问返回的 URL(如 https://myGoWebApp.azurewebsites.net)查看应用是否运行。

步骤 4:使用 GitHub Actions 实现持续部署(可选)

为自动化部署,在您的仓库中添加 GitHub Actions 工作流。创建 .github/workflows/deploy.yml 文件:

name: Deploy to Azure App Service

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: yourdockerhubusername/go-web-app:latest

    - name: Deploy to Azure
      uses: azure/webapps-deploy@v2
      with:
        app-name: myGoWebApp
        slot-name: production
        images: yourdockerhubusername/go-web-app:latest

替换 yourdockerhubusername 为您的 Docker Hub 用户名,并在 GitHub 仓库设置中添加 Azure 凭据作为 secrets(如 AZURE_WEBAPP_PUBLISH_PROFILE)。

常见问题排查

  • 端口绑定错误:确保在代码和 Azure 设置中使用相同端口(如 8080)。检查 Azure App Service 的“配置”部分中的 WEBSITES_PORT
  • Docker 构建失败:运行 docker build 时,确保 go.mod 文件存在且依赖正确。如果问题持续,尝试在本地运行 go mod tidy 清理依赖。
  • 应用无法访问:在 Azure 门户中,检查“日志流”以查看实时日志,诊断启动错误。

通过以上步骤,您的 Go Web 应用应能成功部署到 Azure。如果遇到具体错误,请提供更多细节(如 Docker 构建日志或 Azure 部署错误消息),我可以进一步协助。

回到顶部