前言

    首先,你得知道 Github Actionimage-syncer 它们是什么?能干什么?

  • Github Action
    Github Action是 Github 推出的持续集成工具,可以帮助我们完成一些自动化工作

  • image-syncer
    image-syncer 是 aliyun 推出的一个docker镜像同步工具,可以将一个仓库的镜像同步到另一个仓库当中,文档:README-zh_CN.md

    本文为什么需要它们?在上一篇搭建k8s ingress的文章中(k8s-安装ingress-nginx-controller以及ingress的应用案例),我们遇到了ingress镜像无法pull的问题,除非翻墙,否则无法拉取,所以我们需要将镜像由“k8s.gcr.io”同步到”registry.hub.docker.com”仓库中,以使得我们能够在本地环境成功pull到镜像。

详细配置步骤

1,第一步,创建一个git仓库,如:docker-image-sync,然后配置action secrets管理docker仓库访问的密码,后续会用到(仓库可能是公开的,且密码类都属于敏感信息,所以添加一个action secrets来管理,避免密码泄露)。

路径:settings >> secrets >> actions >> New repository secret

如图:
添加action secrets

2,第二步,在仓库中新建一个文件:config.json,配置授权以及需要同步的镜像信息,有一点需要注意,密码使用一个变量来代替,后续在actions配置中进行替换,避免泄露,如:

1
2
3
4
5
6
7
8
9
10
11
{
"auth": {
"registry.hub.docker.com": {
"username": "guolin123",
"password": "DOCKERHUB_PASSWORD"
}
},
"images": {
"k8s.gcr.io/ingress-nginx/controller": "guolin123/ingress-nginx-controller"
}
}

3,第三步,创建actions任务,路径:actions >> set up workflow youself,并完成工作流的具体步骤配置:

  • a,指定工作流执行的触发条件,这里设置为 “main分支发生push” 以及 “每日UTC时间01:00” 定时执行
    1
    2
    3
    4
    5
    on:
    push:
    branches: [ main ]
    schedule:
    - cron: '0 01 * * *'
  • b,steps步骤配置,首先checkout代码,将config.json配置文件克隆到虚拟机本地
    1
    2
    - name: Checkout
    uses: actions/checkout@v2
  • c,steps步骤配置,镜像同步配置处理,使用${{secrets.secret名称}}获取secret值,并采用sed命令完成数据替换
    1
    2
    3
    - name: 镜像同步配置处理
    run: |
    sed -i 's/DOCKERHUB_PASSWORD/${{ secrets.DOCKERHUB_PASSWORD }}/g' config.json
  • d,steps步骤配置,下载image-sync工具包、解压,并指定config.json执行
    1
    2
    3
    4
    5
    6
    7
    8
    - name: 下载image-sync工具包
    run: |
    wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
    tar -zxf image-syncer-v1.3.1-linux-amd64.tar.gz

    - name: 执行同步镜像
    run: |
    ./image-syncer --proc=2 --config=config.json --retries=2

完整的main.yml配置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
name: docker-image-sync
on:
push:
branches: [ main ]
schedule:
- cron: '0 01 * * *'

jobs:
image-sync:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v2

- name: 镜像同步配置处理
run: |
sed -i 's/DOCKERHUB_PASSWORD/${{ secrets.DOCKERHUB_PASSWORD }}/g' config.json

- name: 下载image-sync工具包
run: |
wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
tar -zxf image-syncer-v1.3.1-linux-amd64.tar.gz

- name: 执行同步镜像
run: |
./image-syncer --proc=2 --config=config.json --retries=2

4,最后,触发执行即可,流水线执行完成后,可以到docker hub中看看镜像的同步情况。

如图:
流水线运行情况