github actons 打包成阿里云镜像

63 min read

前言

目前因为 docker 的镜像下载不稳定而且速度极慢

曲线求国,使用 Github Actions 打包镜像上传到阿里云 再进行分发可以实现镜像的快速下载和部署镜像

用到的工具

GitHub CLI - 命令行配置环境变量

Github Actions - CICD编排工具

1. 注册器镜像服务 ACR

注册地址: https://www.aliyun.com/product/acr

目前个人实例限制: 目前全球地域下仓库默认限额为 300 个 对于个人用来说绰绰有余

2. 安装GitHub CLI

使用 GitHub 的命令行工具 gh(GitHub CLI)可以用来设置仓库的 secrets和actions 的运行状态。

gh 是 GitHub 提供的官方命令行工具,支持管理 GitHub 仓库的各种功能。

1. 安装 GitHub CLI

如果你还没有安装 GitHub CLI,可以通过以下命令安装:

  • macOS:

    brew install gh
    
  • Windows (通过 Scoop):

    scoop install gh
    
  • Linux:
    使用包管理器安装或按照官方说明:GitHub CLI安装指南

2. 登录 GitHub

在命令行中,使用 gh 登录到你的 GitHub 帐户:

gh auth login

它会提示你选择登录方式,通常你可以使用浏览器登录并授权访问 GitHub CLI。

3. 给仓库设置 Secret

使用以下命令为指定的仓库添加一个 secret:

gh secret set SECRET_NAME --body "your_secret_value" --repo owner/repo
  • SECRET_NAME 是 secret 的名称,比如 ALIYUN_PASSWORD
  • your_secret_value 是 secret 的值。
  • owner/repo 是 GitHub 仓库的所有者和名称,比如 my-org/my-repo

示例:

假设你要为仓库 my-org/my-repo 设置名为 ALIYUN_PASSWORD 的 secret,值为 mypassword123,可以运行以下命令:

gh secret set ALIYUN_PASSWORD --body "mypassword123" --repo my-org/my-repo

4. 从文件设置 Secret

如果你的 secret 值在某个文件中(例如 .env 文件),可以直接通过 gh 从文件中设置 secret:

gh secret set SECRET_NAME --body "$(cat .env | grep SECRET_NAME | cut -d '=' -f2)" --repo owner/repo

或者,你可以直接指定整个文件内容作为 secret:

gh secret set SECRET_NAME --body "$(cat path/to/file)" --repo owner/repo

5. 查看仓库的 Secret 列表

如果你想查看当前仓库中所有的 secrets,可以使用以下命令:

gh secret list --repo owner/repo

3. 配置环境变量

在 ACR后台创建后镜像的相关内容后,找到如下的环境变量

# 阿里云账户的用户名,用于 Docker 登录
ALIYUN_USERNAME="[email protected]"

# 阿里云账户的密码,用于 Docker 登录
ALIYUN_PASSWORD="your-aliyun-password"

# 阿里云 Docker Registry 的地址
ALIYUN_REGISTRY="registry.cn-hangzhou.aliyuncs.com"

# Docker 镜像的名称,通常为组织名/镜像名的格式
IMAGE_NAME="your-docker-image-name"

# Docker 镜像的版本,通常为 'latest' 或者具体的版本号
IMAGE_VERSION="your-docker-image-version"

# Dockerfile 的路径,通常为项目根目录下的 Dockerfile
DOCKERFILE_PATH="./Dockerfile"

# 构建 Docker 镜像时使用的上下文目录,通常为项目的根目录
CONTEXT_DIR="."

使用上面安装的 gh 命令行同步环境至仓库

# 阿里云账户的用户名,用于 Docker 登录
gh secret set ALIYUN_USERNAME --body "[email protected]" --repo panw3i/wechat-upload

# 阿里云账户的密码,用于 Docker 登录
gh secret set ALIYUN_PASSWORD --body "your-aliyun-password" --repo panw3i/wechat-upload

# 阿里云 Docker Registry 的地址
gh secret set ALIYUN_REGISTRY --body "registry.cn-hangzhou.aliyuncs.com" --repo panw3i/wechat-upload

# Docker 镜像的名称,通常为组织名/镜像名的格式
gh secret set IMAGE_NAME --body "your-docker-image-name" --repo panw3i/wechat-upload

# Docker 镜像的版本,通常为 'latest' 或者具体的版本号
gh secret set IMAGE_VERSION --body "your-docker-image-version" --repo panw3i/wechat-upload

# Dockerfile 的路径,通常为项目根目录下的 Dockerfile
gh secret set DOCKERFILE_PATH --body "./Dockerfile" --repo panw3i/wechat-upload

# 构建 Docker 镜像时使用的上下文目录,通常为项目的根目录
gh secret set CONTEXT_DIR --body "." --repo panw3i/wechat-upload

设置的环境变量将用于 github actions 内容编排, 使用环境变量也可以比较安全的保护数据不被外泄

4. 配置 github actions 的具体内容

具体的路径为 .github/workflows/docker-build-and-push.yml

内容如下, 供参考修改:

name: Docker Build and Push to Aliyun

on:
  push:
    branches:
      - master  # 当推送到 master 分支时触发

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # 检出当前仓库代码
      - name: Checkout repository
        uses: actions/checkout@v3

      # 安装必要的工具
      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y jq

      # 登录到阿里云 Docker Registry
      - name: Log in to Aliyun Docker Registry
        env:
          ALIYUN_USERNAME: ${{ secrets.ALIYUN_USERNAME }}
          ALIYUN_PASSWORD: ${{ secrets.ALIYUN_PASSWORD }}
          ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
        run: |
          docker login --username "$ALIYUN_USERNAME" --password "$ALIYUN_PASSWORD" "$ALIYUN_REGISTRY"

      # 构建 Docker 镜像
      - name: Build Docker image
        env:
          IMAGE_NAME: ${{ secrets.IMAGE_NAME }}
          IMAGE_VERSION: ${{ secrets.IMAGE_VERSION }}
        run: |
          docker build -t $IMAGE_NAME:$IMAGE_VERSION .

      # 标记 Docker 镜像
      - name: Tag Docker image
        env:
          IMAGE_NAME: ${{ secrets.IMAGE_NAME }}
          IMAGE_VERSION: ${{ secrets.IMAGE_VERSION }}
          ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
        run: |
          docker tag $IMAGE_NAME:$IMAGE_VERSION $ALIYUN_REGISTRY/$IMAGE_NAME:$IMAGE_VERSION

      # 推送 Docker 镜像到阿里云
      - name: Push Docker image to Aliyun
        env:
          IMAGE_NAME: ${{ secrets.IMAGE_NAME }}
          IMAGE_VERSION: ${{ secrets.IMAGE_VERSION }}
          ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }}
        run: |
          docker push $ALIYUN_REGISTRY/$IMAGE_NAME:$IMAGE_VERSION

这个 GitHub Actions 工作流配置的目的是在推送到 master 分支时,自动构建并推送 Docker 镜像到阿里云的 Docker Registry。主要步骤包括:

  1. 检查代码:使用 actions/checkout 拉取仓库代码。
  2. 安装依赖:安装必要的工具,如 jq
  3. 登录阿里云 Docker Registry:通过 docker login 登录到阿里云 Docker 镜像仓库。
  4. 构建 Docker 镜像:使用 Dockerfile 构建镜像,版本由环境变量控制。
  5. 标记镜像:给镜像打上标签,以便推送到指定的阿里云镜像仓库。
  6. 推送镜像:将构建好的 Docker 镜像推送到阿里云。

接下来使用如果你没有做任何的代码修改, 可以提交一个空提交至 master 分支

一旦提交成功就可以自动触发 github actions 的编排动作

git commit --allow-empty -m "空提交"

可以通过 github 仓库actions页面进行查看当前的运行状态

这里使用命令行进行查看,在本地项目下运行如下的命令:

gh run list

使用以下命令来查看某次运行的详细信息 如果有报错 再依据报错信息进行下一步的调试

gh run view <run-id>

5. 使用镜像

这里使用 docker-compose 进行容器的编排

注意一下这里的地址registry.cn-hangzhou.aliyuncs.com 是ACR上选择的区域 并不是固定死的

version: '3'
services:
  app:
    image: registry.cn-hangzhou.aliyuncs.com/<name-space>/<image-name>
    restart: always
    volumes:
      - ./data:/data
    ports:
      - "8089:8080"