Next.js logomarkGitHub 多 Docker 镜像仓库管理

2023年7月13日

Openai logomark
Hamster1963

实现目的

公司后端的服务采用Docker镜像的方式进行分发与部署,之前选用DockerHub作为托管平台,但由于DockerHub对于私有仓库数的限制以及最近各种网络状况频出,选用GitHub在2020年推出的ghcr以及阿里云的容器镜像服务都可以更好的满足公司内部对于安全以及持续集成的需求。

Untitled

Untitled

GitHub Actions

整个CICD的流程都采用GitHub Actions来进行,采用GitHub Actions的优点有很多,不仅可以很方便的看到整个自动化的进度,而且从维护成本来看只需要管理好GitHub Actions的配置文件即可,配置文件也叫做工作流文件(workflow),采用yml格式文件进行编写。

Untitled

推送至ghcr与阿里云

在Actions中,我们采用几个核心的步骤来进行镜像的打包,标记与分发。

  1. 首先进行不同库的登录操作,目的是获取对应仓库的操作权限。
  2. 对镜像进行不同仓库的对应标记,使其可以上传到对应的仓库中。
  3. 进行分发。

在GitHub Actions中有许多已经封装好核心逻辑的Action可供使用,有官方的也有第三方的,在本Action中与Docker相关的操作都采用了docker官方出品的Action。

登录操作

由于ghcr是GitHub官方的镜像库,因此用户名与密码并不需要显式定义出来,用户名用${{ github.repository_owner }} ,password用${{ secrets.GITHUB_TOKEN }}即可,需要注意的是,上传至ghcr需要开放github_token对于库的读写权限,可在仓库设置中开启。

在Settings-Actions-General中,将Workflow permissions的权限勾选为读写权限。

Untitled

Untitled

对于阿里云的镜像管理服务,则需要在secret中定义从阿里云获取的用户名与密码。

Untitled

- name: Login to GitHub Container Registry
  uses: docker/login-action@v2
  with:
	  registry: ghcr.io
    username: ${{ github.repository_owner }}
		password: ${{ secrets.GITHUB_TOKEN }}

- name: Login to AliYun Container Registry
  uses: docker/login-action@v2
  with:
		registry: registry.cn-guangzhou.aliyuncs.com
		username: ${{ secrets.ALI_USERNAME }}
    password: ${{ secrets.ALI_TOKEN }}

对镜像进行标记

在images一栏中填入ghcr与阿里云的镜像地址即可,下方的tags为标记的逻辑。

默认采用latest与当前tag版本号即可。

- name: Extract metadata (tags, labels) for Docker
  id: meta
  uses: docker/metadata-action@v4
  with:
	  images: |
            ghcr.io/${{ github.repository }}
            registry.cn-guangzhou.aliyuncs.com/hamster-home/kes-speed-backend
    tags: |
            type=raw,value=latest
            type=ref,event=tag

进行镜像的推送

- name: Build and push Docker image
  uses: docker/build-push-action@v4
  with:
	 context: .
     push: true
     tags: ${{ steps.meta.outputs.tags }}
     labels: ${{ steps.meta.outputs.labels }}

推送后续

推送后即可在GitHub以及阿里云中看到最新推送的镜像。

Untitled