前言
目前因为 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。主要步骤包括:
- 检查代码:使用
actions/checkout
拉取仓库代码。 - 安装依赖:安装必要的工具,如
jq
。 - 登录阿里云 Docker Registry:通过
docker login
登录到阿里云 Docker 镜像仓库。 - 构建 Docker 镜像:使用 Dockerfile 构建镜像,版本由环境变量控制。
- 标记镜像:给镜像打上标签,以便推送到指定的阿里云镜像仓库。
- 推送镜像:将构建好的 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"