使用 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 Image

on:
push:
branches:
- main # 触发推送的主要分支
workflow_dispatch: # 允许手动触发工作流 jobs:
build: runs-on: ubuntu-latest env:
DOCKERFILE_PATH: ${{ github.event.inputs.dockerfile_path || 'runtime/python' }} # 默认路径
IMAGE_TAG: ${{ github.sha }} steps:
- name: Checkout the repository
uses: actions/checkout@v3 - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2 - name: Log in to GitHub Package Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} - name: Log in to Aliyun ACR
run: echo "${{ secrets.ALIYUN_ACR_PASSWORD }}" | docker login --username=${{ secrets.ALIYUN_ACR_USERNAME }} --password-stdin ${{ secrets.ALIYUN_ACR_REGISTRY }} - name: Build and push
uses: docker/build-push-action@v3
with:
context: ${{ env.DOCKERFILE_PATH }}
file: ${{ env.DOCKERFILE_PATH }}/Dockerfile
push: true
tags: |
${{ 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。这是一个已知问题,正在寻找解决方案。

使用 GitHub Actions 构建 CosyVoice 项目的运行环境镜像并推送到阿里云容器镜像服务和 GitHub Package Registry的更多相关文章

  1. 经GitHub将kubernetes镜像推送到阿里云

    背景 在安装kubernetes时会出现无法访问镜像站的情况,通过GitHub将kubernetes镜像推送到阿里云之后,即可使用阿里云地址引用所需镜像,现已同步镜像5000+,当前还在陆续同步.仓库 ...

  2. 两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库

    两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库 1.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试. ...

  3. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  4. 如何将本地项目推送到码云仓库或者GitHub仓库

    将本地项目推送到码云仓库. 前提: git 和码云   1.在码云上先创建一个仓库. 2.在要被上传的项目的目录右键, 选择 Git Bash Here. 3.在窗口输入命令: git init 这时 ...

  5. Django项目: 项目环境搭建 ---- 三、在码云平台创建项目&推送到码云上

    三.在码云平台创建项目 git服务平台: 主要使用github(最主流) 国内访问速度慢 托管私有项目收费 国内一般使用码云gitee 国内访问速度快 托管私有项目免费(限制开发人数) 公司中使用gi ...

  6. 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序

    小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...

  7. Git实现1个项目2个地址1次推送

    Git实现1个项目2个地址1次推送 考虑到不需要pull操作,因此本方法适用于个人项目分别在两个平台或地址进行部署 给origin 增加一个可以push的地址 git remote set-url - ...

  8. Linux下Jenkins与GitHub自动构建Node项目(Vue)

    根据上篇文章<Linux下Jenkins与GitHub自动构建NetCore与部署>,我们知道了Jenkins的强大功能,自动构建,部署了一个NetCore的Web,让开发人员专注于开发, ...

  9. Jenkins构建项目后发送钉钉消息推送

    前言 钉钉是我们日常工作的沟通工具,在Jenkins构建持续集成项目配合钉钉机器人的功能,可以让我们在持续集成测试环节快速接收到测试结果的消息推送. 一:新建一个钉钉群,选择自定义机器人 二:添加机器 ...

  10. (一)构建基于ubuntu docker MySQL 5.6 镜像并推送到Docker Hub

    一,创建目录二,文件准备三,构建四,使用五,在宿主机上连接docker 中的mysql六,推送镜像到Docker hub 一,创建目录 mkdir -p mysql/5.6 二,文件准备 注意执行脚本 ...

随机推荐

  1. 百思不得其解,DeepSeek怎么突然就比肩GPT了?

    >关注公众号**回复1**>>获取**一线.总监.高管<管理秘籍>** 之前大家都认为中美在AI领域的差距很大,谁曾想春节期间**DeepSeek横空出世**,直接给Op ...

  2. Jenkins插件:Publish over SSH

    Jenkins插件:Publish over SSH Jenkins作为一个开源的持续集成和交付工具,通过插件扩展可以实现各种功能.其中,Publish over SSH插件是Jenkins的一个常用 ...

  3. [大模型/AI/GPT] Chatbox:大模型可视化终端应用

    序 概述:Chatbox AI Chatbox AI 是一款 AI 客户端应用和智能助手,支持众多先进的 AI 模型和 API,可在 Windows.MacOS.Android.iOS.Linux 和 ...

  4. 你的边比较松弛:最短路的 Bellman-Ford 和 SPFA 方法

    Dijkstra 的局限性 在带权图的最短路径问题中,我们的目标是从一个起点出发,找到到达其他所有节点的最短路径.无论是交通导航中的最短耗时路线,还是金融网络中的最小成本路径,这一问题的核心始终是如何 ...

  5. 嵌入式linux下的FTP服务器配置记录

    嵌入式linux FTP服务器 一般嵌入式Linux下的FTP服务器会有什么要求呢?一般来说差不多如下所示 账号认证,需要特定用户才能访问(不一定要和登录用户挂钩) 根目录固定在一个固定的位置,且不能 ...

  6. [BZOJ3514] [Codechef MARCH14] GERALD07加强版 题解

    名字感觉挺奇怪的. 考虑离线算法.首先答案就是用 \(n\) 减去连完边后的生成树森林边数.生成树当然就可以用 \(lct\) 求解了.我是不会告诉你这个时候我已经开始想回滚莫队了的. 考虑当我们倒序 ...

  7. Qt QVariant 与 自定义类型转换的方法

    Example: 1. 声明自定义类型可用于QVariant,类也能用,也是这样,QT的基本数据类型不用声明就可以用,而且存入是什么类型,拿出来还是什么类型 #include <QMetaTyp ...

  8. MySQL Q&A - [02] windows上MySQL的安装路径变更之后无法启动MySQL服务

    参考:https://blog.csdn.net/weixin_45271005/article/details/130091868 Step1:首先,变更之前,需要保证MySQL服务是停止运行的 S ...

  9. 大数据之路Week08_day02 (Flume架构介绍和安装)

    Flume架构介绍和安装 写在前面在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中,也 ...

  10. 【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作

    问题描述 在使用Azure上的存储服务 Storage Account 的时候,有时需要代替 它原本提供的域名进行访问,比如默认的域名为:mystorageaccount.blob.core.chin ...