使用 GitHub Actions 构建 CosyVoice 项目的运行环境镜像并推送到阿里云容器镜像服务和 GitHub Package Registry
概述
本文介绍了如何使用 GitHub Actions 构建 CosyVoice 项目的运行环境 Docker 镜像,并将其推送到阿里云容器镜像服务(ACR)和 GitHub Package Registry。通过挂载本地代码和模型的方式,运行时环境被独立打包为 Docker 镜像,便于分发和部署。这种方式使得项目的依赖和运行环境可控,并且可以在不同环境下保持一致性。
准备工作
1. 配置环境变量
在 GitHub 仓库的设置页面中,添加以下必要的环境变量:
ALIYUN_ACR_USERNAME
: 登录阿里云容器镜像服务的用户名。ALIYUN_ACR_PASSWORD
: 登录阿里云容器镜像服务的密码。ALIYUN_ACR_REGISTRY
: 阿里云容器镜像服务的注册表 URL。GHCR_USERNAME
: GitHub Packages 的用户名。GHCR_TOKEN
: GitHub Packages 的个人访问令牌。IMAGE_NAME
: Docker 镜像名称。
这些信息可以通过 GitHub 仓库的 Settings -> Secrets and variables -> Secrets 页面添加。
2. 创建 Dockerfile
在 CosyVoice
项目中,使用 runtime/python/Dockerfile
文件,该文件定义了构建运行环境 Docker 镜像的指令。确保 Dockerfile 根据项目需求进行了正确配置,特别是镜像中的 Python 环境和依赖。
设置 GitHub Actions
1. 创建通用工作流模板文件
创建一个通用的 GitHub Actions 工作流模板,通过参数化配置使得同一份工作流文件适用于不同项目。对于 CosyVoice
项目,可以根据需求调整工作流中的参数和路径。
2. 编写工作流脚本
name: Build and Push CosyVoice Runtime Environment Docker Imageon:push:branches:- main # 触发推送的主要分支workflow_dispatch: # 允许手动触发工作流jobs:build:runs-on: ubuntu-latestenv:DOCKERFILE_PATH: ${{ github.event.inputs.dockerfile_path || 'runtime/python' }} # 默认路径IMAGE_TAG: ${{ github.sha }}steps:- name: Checkout the repositoryuses: actions/checkout@v3- name: Set up Docker Buildxuses: docker/setup-buildx-action@v2- name: Log in to GitHub Package Registryuses: docker/login-action@v2with:registry: ghcr.iousername: ${{ github.actor }}password: ${{ secrets.GITHUB_TOKEN }}- name: Log in to Aliyun ACRrun: echo "${{ secrets.ALIYUN_ACR_PASSWORD }}" | docker login --username=${{ secrets.ALIYUN_ACR_USERNAME }} --password-stdin ${{ secrets.ALIYUN_ACR_REGISTRY }}- name: Build and pushuses: docker/build-push-action@v3with:context: ${{ env.DOCKERFILE_PATH }}file: ${{ env.DOCKERFILE_PATH }}/Dockerfilepush: truetags: |${{ secrets.ALIYUN_ACR_REGISTRY }}/${{ github.repository }}:${{ env.IMAGE_TAG }}ghcr.io/${{ github.repository }}:${{ env.IMAGE_TAG }}
该工作流文件包含以下关键特性:
- 参数化配置:通过输入参数指定 Dockerfile 的路径,默认为
runtime/python
,从而使得该工作流能够适应不同项目的结构。 - 手动触发选项:除了基于推送事件触发外,还提供了
workflow_dispatch
选项,使得用户可以手动触发工作流,便于进行测试或按需构建。
配置 Podman 命令
为了将本地代码和模型挂载到容器中并运行,可以使用以下 Podman 命令:
podman run -d \--name cosyvoice \--device=nvidia.com/gpu=all \-v ${LOCAL_PROJECT_PATH}:/opt/CosyVoice \-p 9233:9233 \${DOCKER_IMAGE}:${IMAGE_TAG} \/bin/bash -c "cd /opt/CosyVoice && python3 api.py"
其中:
${LOCAL_PROJECT_PATH}
是本地项目的路径,可以设置为环境变量。${DOCKER_IMAGE}
是推送到注册表的镜像名称。${IMAGE_TAG}
是镜像标签,通常为构建哈希值${{ github.sha }}
。
请确保系统已安装 NVIDIA Container Toolkit,并正确配置本地环境,以支持 Podman 与 NVIDIA GPU 的交互。
未解决的问题
目前,在使用 podman compose
运行容器时,无法通过该方式使用宿主机的 GPU。这是一个已知问题,正在寻找解决方案。