自动化集成与部署(二)
设想一下,我们需要周期性地执行一个计算密集型任务,并且需要利用本地的计算资源。为此,我们可以向仓库添加自托管的运行器,通过将任务以文本形式提交到仓库的指定分支,触发 GitHub Action 来执行工作流。由于科学计算任务通常需要非常复杂的环境配置,我们可以提前构建好镜像(包括可以执行GPU程序的镜像),通过 GitHub Action 拉取这些镜像并在容器中执行命令,从而省略冗长的环境配置步骤,节省时间。
打包容器为镜像并上传
在本地容器中配置好环境,停止容器,将容器打包成镜像,上传到 Docker Hub.
sudo docker stop 530d5a791f5a
sudo docker commit 530d5a791f5a mapengfei/npuheart:latex
docker push mapengfei/npuheart:latex
sudo docker run -it mapengfei/npuheart:latex bash
直接构建镜像并上传
镜像直接从 Dockerfile 文件构建。
docker rmi mapengfei/npuheart:latex
docker tag npuheart:latest mapengfei/npuheart:latex
docker push mapengfei/npuheart:latex
sudo docker rmi mapengfei/npuheart:latex
在 GitHub Action 中拉取镜像并使用
参见文档:在容器中运行作业
在 GitHub Action 中构建镜像并上传
参考文件:docker.yml
每次打标签都会进行一次docker镜像构建,并通过推送到 Docker Hub.
name: Publish Docker image
on:
push:
tags:
- '*'
workflow_dispatch:
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: mapengfei/npuheart
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: images-latex-newest/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}