如何使用Github操作将多容器应用程序部署到Azure? [英] How to deploy a multi-container app to Azure with a Github action?

查看:25
本文介绍了如何使用Github操作将多容器应用程序部署到Azure?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个多容器应用程序,源代码存储在Github上。本质上,活动开发只有一个部分,其他容器要么是稳定的(比如有特殊设置的nginx),要么是外部的(比如redis)。

我的问题是:如何使用Github操作部署到Azure应用服务?

对于单容器应用程序来说,这相当well-described,并且我已经能够通过一个操作将我的图像推送到Container注册表。但是,我仍然必须转到Azure Web界面并从那里触发docker-compose。或者,我也可以从本地计算机的Azure CLI触发docker-compose

但实际问题是从Github操作触发docker-compose(以便在我的PR每次验证到master时进行部署)。

有什么想法吗?

作为参考点:我的docker-compose.yml如下:

version: '3'

services:
  nginx:
    image: mycr.azurecr.io/nginx:dev-latest
    ports:
      - "80:80"
      - "2222:2222"
    volumes: 
      - asset-volume/app/static
    depends_on:
      - app
    restart: always
  app:
    image: mycr.azurecr.io/django:dev-latest
    ports:
      - "8000:8000"
    volumes: 
      - asset-volume:/app/static
      - app-volume:/app
      - api-documents:/app/documents/storage
  redis:
    image: redis:alpine
  celery:
    restart: always
    command: celery -A mainApp worker -l info
    image: mycr.azurecr.io/django:dev-latest
    volumes:
      - app-volume:/app
    working_dir: /app
    depends_on:
      - app
      - nginx
      - redis

volumes: 
  asset-volume
  app-volume
    

推荐答案

真正的解决方案似乎只有通过Azure CLI才有可能,但目前我提出了一个部分解决方案。这就是为什么我无法将自己的答案标记为接受的解决方案(&Q;)。

在我的操作中(见下文):

  1. 我登录到Azure和Docker(所有凭据都存储在GitHub Secrets中)
  2. 我从Dockerfile
  3. 构建我的应用程序
  4. 最后,我使用两个标记latest<date>-<hash>将图像推送到Azure容器注册表

然后,在Azure上:MyApp在AppService>;部署中心

  • 来源:容器注册中心
  • 集装箱类型:码头人员组成
  • 配置docker-compose.yml

就是这样。此后,在每次合并验证时,GitHub配置项都会将准备就绪的图像推送到容器注册表。我只需要点击图形用户界面上的重新启动按钮,就可以重新启动我的应用程序。然后Docker将加载新的latest镜像。当然,这仍然是手动操作,但总比什么都没有好。

我的delpoyment.yml操作如下所示(我省略了不重要的细节):

name: 'Deployment to Azure'
on:
  push:

env:
  DEV_URL: 'my-dev-app.example.com'
  DEV_DBNAME: 'app-dev-db'
  PROD_URL: ''my-app.example.com''
  PROD_DBNAME: 'app-dev-db'


jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: 'Get the branch name'
      id: branch-name
      uses: tj-actions/branch-names@v5

    - name: 'Set RAW_BRANCH variable'
      run: echo "RAW_BRANCH=${{ steps.branch-name.outputs.current_branch }}" >> $GITHUB_ENV

    - name: 'Checkout repo'
      uses: actions/checkout@v2

    - name: 'Sets branch-related variables'
      # `main` -> `prod`, `dev` -> `dev`,
      # everything else -> `feat`:
      run: |
        if [[ $RAW_BRANCH == 'main' ]]; then
          echo "BRANCH=prod" >> $GITHUB_ENV
        elif [[ $RAW_BRANCH == 'dev' ]]; then
          echo "BRANCH=$RAW_BRANCH" >> $GITHUB_ENV
          echo "DBNAME=${{ env.DEV_DBNAME }}" >> $GITHUB_ENV
          echo "URL=${{ env.DEV_URL }}" >> $GITHUB_ENV
        else
          echo "BRANCH=feat" >> $GITHUB_ENV; fi
          echo "DBNAME=${{ env.DEV_DBNAME }}" >> $GITHUB_ENV
          echo "URL=${{ env.DEV_URL }}" >> $GITHUB_ENV

    - name: 'Set SHA variable'
      run: echo "SHA=$(git rev-parse --short HEAD)" >> $GITHUB_ENV

    - name: 'Set TAG variable'
      run: echo "TAG=${{ env.BRANCH }}-$(date "+%Y.%m.%d")-${{ env.SHA }}" >> $GITHUB_ENV

    - name: 'Login via Azure CLI'
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    - name: 'Login to Container Registry'
      uses: azure/docker-login@v1
      with:
        login-server: ${{ secrets.DOCKER_REGISTRY_SERVER_URL }}
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - name: 'build and push'
      run: |
        docker build -t ${{ secrets.DOCKER_REGISTRY_SERVER_URL }}/backend:${{ env.TAG }}  
                     -t ${{ secrets.DOCKER_REGISTRY_SERVER_URL }}/backend:${{ env.BRANCH }}-latest .
        docker push --all-tags ${{ secrets.DOCKER_REGISTRY_SERVER_URL }}/backend

然后我在部署中心dev实例的配置如下所示:

version: '3'

services:
  nginx:
    image: myacr.azurecr.io/nginx:latest
    ports:
      - "80:80"
      - "2222:2222"
    volumes: 
      - asset-volume-dev:/app/static
    depends_on:
      - app
    restart: always
  app:
    image: myacr.azurecr.io/backend:dev-latest
    ports:
      - "8000:8000"
    volumes: 
      - asset-volume-dev:/app/static
      - app-volume-dev:/app
  redis:
    image: redis:alpine
  celery:
    restart: always
    command: celery -A superDuperApp worker -l info
    image: myapp.azurecr.io/backend:dev-latest
    volumes:
      - app-volume-dev:/app
    working_dir: /app
    depends_on:
      - app
      - nginx
      - redis

volumes:
  asset-volume-dev:
  app-volume-dev:

⚠️:出于某种不明原因,如果我将保留在应用程序根目录中的,则部署脚本将是与其在Azure图形用户界面的配置中编写的内容的某种奇怪的组合。因此,我不得不从存储库的根文件夹中删除docker-compose.yml

这篇关于如何使用Github操作将多容器应用程序部署到Azure?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆