抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

docker诞生至今,不过短短九年时间,已经风靡世界,引起了科技世界一场巨大的革命。

然而因为国内外网络不通,所以导致我们部署开源镜像的时候,经常无法拉取镜像,这个问题曾经也苦恼了我不短的时间。

在一开始的时候解决这个问题就是自己使用国外的服务器来拉取镜像,然后push到国内的仓库,但是一段时间过后发现做的都是重复的工作,从工程师的角度来说,重复的工作会浪费大量不必要的时间,最好可以引入自动化工作来替代它,解放双手,何乐而不为呢。

过程

我的镜像仓库主要是使用的是阿里云的镜像仓库,基本上免费,在国内速度还快,我提前配置好了阿里云的镜像仓库和命名空间,账号密码到github的secrets中,在此就不多做赘述。

自动化的过程分为了两个阶段,第一个阶段是人工智能半自动化,我使劲研究了github的action文档,发现可以使用矩阵的方式来同步多个镜像,如下:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# This is a basic workflow to help you get started with Actions

name: Sync Dokcer Image To Aliyun Repo

# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the master branch
# push:
# branches: [ master ]

# Allows you to run this workflow manually from the Actions tab

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
sync-task:
# The type of runner that the job will run on
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- source_docker_image: mattermost/mattermost-enterprise-edition:7.5.0
target_docker_image: mattermost-enterprise-edition:7.5.0
- source_docker_image: nginx:latest
target_docker_image: nginx:latest

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2

# Runs a set of commands using the runners shell portainer/agent

#docker pull --platform=arm64 $source_docker_image
- name: sync ${{ matrix.target_docker_image }}
run: |
docker pull $source_docker_image
docker tag $source_docker_image $target_docker_image
docker login --username=${{secrets.DOCKER_USERNAME}} --password=${{secrets.DOCKER_PASSWORD}} ${{secrets.DOCKER_REGISTRY}}
docker push $target_docker_image
env:
source_docker_image: ${{ matrix.source_docker_image }}
target_docker_image: ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{ matrix.target_docker_image }}

以上我是通过自己手动写matrix的方式来实现同时同步多个镜像,突然有一天发现,好像这样也没有完全解放双手,我仍然需要不断的提交代码来同步别的镜像。

技术之所以称之为技术,是因为不同的技术它的思想是可以共通的。我想起不久之前自己同步github仓库使用的是github的api来进行仓库的同步,那么用github的api来做这件事情,可以不可以呢?答案是肯定的。

首先,看文档:使用矩阵来执行JOB

做技术的,文档就是代码的说明书,还是非常具有参考的价值的。

然后改造上面的docker-sync-api.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
28
29
# 同步镜像仓库的镜像到阿里云仓库
name: Sync Dokcer Image To Aliyun Repo By Api

on:
repository_dispatch:
types: sync_docker

jobs:
sync-task:
# The type of runner that the job will run on
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
#接收Api的参数
images: '${{ github.event.client_payload.images }}'

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/checkout@v2
- name: sync ${{ matrix.images.source }}
run: |
docker pull $source_docker_image
docker tag $source_docker_image $target_docker_image
docker login --username=${{secrets.DOCKER_USERNAME}} --password=${{secrets.DOCKER_PASSWORD}} ${{secrets.DOCKER_REGISTRY}}
docker push $target_docker_image
env:
source_docker_image: ${{ matrix.images.source }}
target_docker_image: ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{ matrix.images.target }}

似乎一切都变得简单了,想要同步什么仓库镜像直接用api请求就可以了,立马就可以响应并且帮你把镜像同步到你想同步的地方。

注意点:

1、需要提前配置目标仓库的DOCKER_REGISTRYDOCKER_USERNAMEDOCKER_PASSWORD在项目的secrets中

2、创建github-token,点击此处 ,保存在本地待用,权限你看着给

3、配置好 docker-sync-api.yml 中的on.repository_dispatch.types为你想要的名称,例如:sync_docker

4、请求githubApi,替换#github-token#username#repo#sync_docker,和json中的client_payload的内容即可,是一个数组,需要同步几个镜像就同步几个

1
curl -X POST -H 'Accept: application/vnd.github.v3+json' -H 'Authorization: token #github-token' https://api.github.com/repos/#username/#repo/dispatches -d '{"event_type":"#sync_docker","client_payload":{"images":[{"source":"vaultwarden/server:1.26.0","target":"bitwarden:1.26.0"},{"source":"postgres:alpine","target":"postgres:alpine"}],"message":"github action sync"}}'

5、详细看看client_payload的内容,提前在json中写好,然后替换到curl 请求中,减少麻烦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"event_type":"sync_docker",
"client_payload":{
"images":[
{
"source":"vaultwarden/server:1.26.0",
"target":"bitwarden:1.26.0"
},
{
"source":"postgres:alpine",
"target":"postgres:alpine"
}
],
"message":"github action sync"
}
}

以上步骤就完成了手动请求github-api,然后github-action自动触发同步镜像仓库的过程。

总结

当你觉得做一件事情是重复且无趣的时候,那么就尽量想法办让它变成自动化的,在这个过程中享受作为技术人的快乐,节省时间来做更有趣的事情。

评论