使用 Github Action 部署 docker 镜像(可用于心理学计算和实验环境)

转自:https://zhuanlan.zhihu.com/p/719739087

如何使用 GitHub Action 部署 Docker 镜像(超详细教程)
随着心理学领域中数据处理(如 fMRI 和 EEG 数据处理)以及计算建模(如贝叶斯建模、认知建模)对计算环境要求的不断提升,建立一个稳定可靠的计算环境变得尤为重要。在这种情况下,Docker 的使用提供了一种有效的解决方案,能够确保环境的一致性和可移植性,避免了本地环境配置繁琐的问题。

然而,Docker 的部署并不总是那么简单,特别是在国内网络环境下,下载镜像和依赖可能会遇到速度慢甚至失败的情况。这时,使用 GitHub Actions 自动化部署 Docker 镜像就显得格外有意义。其优势在于:

无需本地配置:只要代码推送到 GitHub 仓库,GitHub Actions 就会自动完成构建和推送,省去了本地繁杂的操作。
跨平台兼容:通过 Buildx 支持多平台镜像的构建,轻松应对不同硬件架构的需求。
优化网络环境问题:利用 GitHub 的服务器优势,避免了国内网络环境下的镜像拉取困境,大大提升了构建速度和成功率。
一些案例:
hub.docker.com
​hub.docker.com/r/hcp4715/hddm
hub.docker.com
​hub.docker.com/r/nipreps/fmriprep

  1. 准备 Dockerfile 文件
    首先,你需要创建一个 Dockerfile,这个文件描述了如何构建你的 Docker 镜像。例如,我们构建一个基于pymc的贝叶斯建模计算环境。用于可以通过如下步骤创建 Dockerfile。

Use the official Jupyter base notebook image with Python 3.10

FROM quay.io/jupyter/scipy-notebook:python-3.10

LABEL maintainer=”USER_NAME

Set environment variables to minimize Docker image size

ENV CONDA_AUTO_UPDATE_CONDA=false \
PATH=”/opt/conda/bin:$PATH”

USER root
RUN apt-get update && apt-get install -y graphviz

Create a new conda environment and install packages

RUN conda install -y \
graphviz \
bambi=0.13.0 \
pymc=5.16.2 \
PreliZ=0.9.0 \
ipympl=0.9.4 \
pingouin=0.5.4 && \
conda clean —all —yes

Remove cache and unused packages to reduce image size

RUN rm -rf /home/jovyan/.cache && \
conda clean —all —yes && \
fix-permissions /home/jovyan

Set the working directory

USER $NB_UID
WORKDIR $HOME

Expose the default Jupyter notebook port

EXPOSE 8888

Command to start Jupyter Notebook

CMD [“start-notebook.sh”]
其中,USER_NAME 和 USER_EMAIL 可以替换为你自己的任意的账户名和邮箱。

  1. 构建并推送 Docker 镜像
    我们有两种方法可以构建和推送 Docker 镜像:

传统使用本地构建并推送
使用 GitHub Actions 自动构建并推送
2.1 本地构建并推送
首先,确保你已经安装了 Docker 并启用了 Buildx 插件。Buildx 是 Docker 提供的扩展工具,允许我们为多平台构建镜像。

你可以运行以下命令来为不同架构构建镜像:

docker buildx build —platform linux/arm64,linux/amd64 -t USER_NAME/IMAGE_NAME . —push
docker buildx build —platform linux/amd64 -t USER_NAME/IMAGE_NAME . —load
同样,USER_NAME 和 IMAGE_NAME 替换为你自己的 docker 账户名和任意的docker镜像名称,例如,pyBayesian
2.2 使用 GitHub Actions 自动化构建
GitHub Actions 是一种强大的工具,可以帮助我们自动化构建和推送 Docker 镜像。你可以通过以下步骤来配置 GitHub Actions。

2.2.1 创建 GitHub Actions 工作流
在你的仓库中创建 .github/workflows/docker-image.yml 文件:

mkdir -p .github/workflows
touch .github/workflows/docker-image.yml
然后在 docker-image.yml 中写入以下内容:

name: Docker-image

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  buildx:
    runs-on: ubuntu-latest
    env:
      NAME_VERSION: xianyuauto:2024v1
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Docker login
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: push amd64
        run: docker buildx build --platform linux/amd64 -t ${{ secrets.DOCKERHUB_USERNAME }}/${{env.NAME_VERSION}}-amd64 -f Dockerfile . --push
      - name: push arm64
        run: docker buildx build --platform linux/arm64 -t ${{ secrets.DOCKERHUB_USERNAME }}/${{env.NAME_VERSION}}-arm64 -f Dockerfile . --push
      - name: Build the Combined Manifest
        run: docker buildx build --platform linux/amd64,linux/arm64 -t ${{ secrets.DOCKERHUB_USERNAME }}/${{env.NAME_VERSION}} -f Dockerfile . --push
      - name: Build the Newest Manifest
        run: docker buildx build --platform linux/amd64,linux/arm64 -t ${{ secrets.DOCKERHUB_USERNAME }}/pybayesian:latest -f Dockerfile . --push

on: 表示部署构建的触发机制。例如,这段代码会在 main 分支有更新时自动触发镜像构建和推送。同时,workflow_dispatch 运行用户在github上手动进行构建。

在build jobs 中, NAME_VERSION 定义了我们镜像的名称和版本,可以通过${{env.NAME_VERSION}} 进行引用。 docker/login-action@v3 表示我们需要登陆 docker 来将docker镜像上传到自己账户的 dockerhub中。在下一节我们可以看到,如何在 github 中如何配置 docker 的账户和token。 我们构建了四个任务,分别对应构建 amd64,arm64,两个平台混合,以及将两个平台混合镜像标记为新标签的部署任务。
2.2.2 配置 GitHub Secrets
为了确保 GitHub Actions 能安全地登录 Docker Hub,你需要在 GitHub 项目的设置中配置 Secrets。具体步骤如下:

在dockerhub 中申请个人token。https://app.docker.com/settings/personal-access-tokens

在GitHub 仓库中设置账户和token
点击右上角的 Settings,在左侧导航栏找到 Secrets and variables,点击 Actions。

添加两个 Secrets:

DOCKERHUB_USERNAME:填入你的 Docker Hub 用户名
DOCKERHUB_TOKEN:填入刚才获取的tokens
添加完成后,GitHub Actions 将能够通过你的账户登录 Docker Hub,并安全地推送镜像。

  1. 最后一步:推送代码并自动部署
    现在,一切配置已经完成!每当你将代码推送到 main 分支时,GitHub Actions 会自动帮你构建 Docker 镜像并推送到 Docker Hub 上。

或者进行手动推送:

总结

以上就是如何使用 GitHub Actions 自动化部署 Docker 镜像的完整流程。从准备 Dockerfile,到使用 GitHub Actions 构建并推送 Docker 镜像,整个过程简单而高效。如果你还没尝试过自动化部署,赶紧动手试试吧!希望这篇教程对你有帮助,有问题的话欢迎留言讨论哦~