通过Github Actions部署Docker至App Service时替换appsettings.json值
解决GitHub Actions部署Docker容器到Azure App Service时替换appsettings.json的问题
完全可行,以下是几种实用方案,按推荐优先级排序:
方案一:用Azure App Service应用设置直接覆盖(推荐)
Azure App Service原生支持通过应用设置覆盖appsettings.json中的配置,无需修改容器内文件,步骤如下:
- 在GitHub仓库的Secrets中存入需要替换的配置项(比如
DB_CONNECTION_STRING) - 在流水线中添加Azure CLI步骤,直接设置应用服务的配置:
- name: Configure App Service settings run: | az webapp config appsettings set --name appname-api-dev --resource-group <你的资源组名称> --settings \ "ConnectionStrings__DefaultConnection=${{ secrets.DB_CONNECTION_STRING }}" \ "AppSettings__ApiUrl=${{ secrets.API_URL }}"
注意:配置键名要用双下划线
__替换JSON中的层级分隔,比如ConnectionStrings.DefaultConnection对应ConnectionStrings__DefaultConnection,.NET应用会自动识别这种映射。
方案二:构建Docker镜像前替换appsettings.json
如果需要在镜像构建阶段就固化配置,可以在GitHub Actions中先修改文件再构建:
- name: Replace appsettings values run: | cd src/App # 用jq工具修改JSON(self-hosted runner需提前安装jq) jq '.ConnectionStrings.DefaultConnection = "${{ secrets.DB_CONNECTION_STRING }}"' appsettings.json > temp.json && mv temp.json appsettings.json # 原有的构建推送步骤不变 - name: Docker Build & Push to ACR run: | cd src/App docker build -f Dockerfile .. --tag dummy.azurecr.io/repo/my-image-name:latest docker push dummy.azurecr.io/repo/my-image-name:latest
如果是Windows环境的self-hosted runner,可改用PowerShell脚本:
$settings = Get-Content appsettings.json | ConvertFrom-Json $settings.ConnectionStrings.DefaultConnection = "${{ secrets.DB_CONNECTION_STRING }}" $settings | ConvertTo-Json -Depth 10 | Set-Content appsettings.json
方案三:通过环境变量传递配置到容器
在Dockerfile中定义环境变量,让应用程序优先读取环境变量覆盖配置:
- 修改Dockerfile添加环境变量:
ENV ConnectionStrings__DefaultConnection="" ENV AppSettings__MaxRetryCount=""
- 应用程序配置为优先读取环境变量(.NET应用默认支持此逻辑)
- 后续通过方案一的Azure CLI步骤设置这些环境变量即可
完整修改后的流水线示例(方案一)
name: appname-api-dev on: push: branches: - main jobs: build: runs-on: self-hosted steps: - name: Log into registry uses: docker/login-action@v1 with: registry: ${{ secrets.ACR_NAME }} username: ${{ secrets.ACR_USERNAME }} password: ${{ secrets.ACR_PASSWORD }} - name: Docker Build & Push to ACR run: | cd src/App docker build -f Dockerfile .. --tag dummy.azurecr.io/repo/my-image-name:latest docker push dummy.azurecr.io/repo/my-image-name:latest - name: 'Login via Azure CLI' uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Configure App Service settings run: | az webapp config appsettings set --name appname-api-dev --resource-group <你的资源组名> --settings \ "ConnectionStrings__DefaultConnection=${{ secrets.DB_CONNECTION_STRING }}" \ "AppSettings__MaxRetryCount=${{ secrets.MAX_RETRY_COUNT }}" - uses: azure/webapps-deploy@v2 with: app-name: 'appname-api-dev' publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} images: dummy.azurecr.io/repo/my-image-name:latest
内容的提问来源于stack exchange,提问作者Modika
相关产品推荐
相关产品推荐

