GitHub Action 自动构建项目容器镜像并 Push 到官方 Docker Hub

首先明确 Docker 镜像的构建流程由项目根目录下的 Dockerfile 文件管理,GitHub Action 自动推送流程则由项目根目录下的 .github/workflows/main.yaml 文件控制。


rab_python_packages 项目为例,文件结构也可直接参考。

1、建立 Dockerfile 文件
文件内容:

# 基础镜像系统版本为 CentOS:7
FROM centos:7

# 维护者信息
LABEL maintainer="Rabbir [email protected]"

# Docker 内用户切换到 root
USER root
# 设置时区为东八区
RUN echo "Asia/shanghai" > /etc/timezone

# 在基础镜像内安装 Git 和 Python3
WORKDIR /root
RUN yum -y install git
RUN curl -s https://gitee.com/senjianlu/one-click-scripts/raw/main/CentOS7%20%E4%B8%8B%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85%20Python3%20%E7%8E%AF%E5%A2%83/install.sh | bash

# 在 /root/GitHub 目录下克隆 rab_python_packages 项目
RUN mkdir /root/GitHub
RUN mkdir /root/GitHub/rab_python_packages
WORKDIR /root/GitHub/rab_python_packages
# 将宿主机当前目录下的所有文件拷贝至镜像内的 /root/GitHub/rab_python_packages 文件夹中
COPY . .

# 配置环境
RUN python3 rab_env.py
RUN python3 rab_env.py rab_chrome

# 删除无用文件
RUN rm -r chromedriver_linux64.zip
RUN rm -r google-chrome-stable_current_x86_64.rpm

# 启动容器时不指定命令则执行以下的默认命令,只取最后一行 CMD 命令生效
CMD cd /root/GitHub/rab_python_packages && python3 rab_logging.py

2、测试 Dockerfile
在 Dockerfile 同目录下执行:

# 镜像名自行替换
docker build -t rabbir/rab_python_packages:latest .

3、建立 GitHub Action 流程
在项目根目录下新建 .github/workflows/ 文件夹并创建 main.yaml 文件:

mkdir .github
mkdir .github/workflows
cd .github/workflows
vi main.py

文件内容:
注:以下文件可以直接复制使用,只需要更改倒数第 4 行的镜像名即可。

# 将项目构建镜像并发布至 Docker Hub
name: CI to Docker Hub

# 在 Push 到 main 分支后启动该流程
on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 在 GitHub Action 的服务器上 Check Out 源码(整体流程结束后会重置服务器环境因此不需要担心泄露)
      - name: Check Out Repo 
        uses: actions/[email protected]
      # 登录至 Docker Hub,账户密码需要在 Settings -> Secrets 中设置
      - name: Login to Docker Hub
        uses: docker/[email protected]
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
      # 设置 Buildx 为构建镜像做准备
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/[email protected]
      # 构建并发布(执行项目路径下的 Dockerfile 文件)
      - name: Build and push
        id: docker_build
        uses: docker/[email protected]
        with:
          context: ./
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_HUB_USERNAME }}/rab_python_packages:latest
      # 完成
      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

结束。