使用 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
- 准备 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 可以替换为你自己的任意的账户名和邮箱。
- 构建并推送 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,并安全地推送镜像。
- 最后一步:推送代码并自动部署
现在,一切配置已经完成!每当你将代码推送到 main 分支时,GitHub Actions 会自动帮你构建 Docker 镜像并推送到 Docker Hub 上。
总结
以上就是如何使用 GitHub Actions 自动化部署 Docker 镜像的完整流程。从准备 Dockerfile,到使用 GitHub Actions 构建并推送 Docker 镜像,整个过程简单而高效。如果你还没尝试过自动化部署,赶紧动手试试吧!希望这篇教程对你有帮助,有问题的话欢迎留言讨论哦~
