首先明确 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 }}
结束。