Skip to content

docker镜像一键拉取,无需梯子/服务器,无数量限制docker images sync workflow and scripts

Notifications You must be signed in to change notification settings

you8023/docker_images_sync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

docker_image_sync

实现效果:

只需一次初始化配置,即可在任意目录下通过执行命令docker_pull mysql:8.0.1 mcp/elasticsearch:latest bitnami/redis:8.0.2-debian-12-r3 ,稍等片刻,实现成功拉取:

image

1. 方案原理

整体方案架构如图所示(所有步骤整合形成了一键自动化脚本,这里架构中的步骤仅为了原理理解):

image

对于希望下载的镜像(例如:mysql:5.7.44):

  1. 将镜像名写入images.txt
  2. 将变更提交到git仓库
  3. 触发github工作流,工作流中定义了执行的脚本
  4. 工作流自动执行同步脚本,从docker官方镜像站pull镜像,并上传到阿里云个人镜像仓库中
  5. 用户再从阿里云个人镜像站拉取镜像
  6. 将拉取到的镜像重命名为目标镜像tag

通过github工作流+阿里云个人镜像仓库的方式,实现从官方镜像站拉取镜像。

具有以下优点:

  • 无需梯子:github可以直接访问、提交文件变更;阿里云个人镜像仓库国内可以满速访问,嘎嘎快
  • 无需服务器:借助github工作流的容器环境实现镜像同步
  • 免费:阿里云个人镜像站可免费创建,总限额300个,用超了删了就行
  • 无拉取限制:经过测试,暂时未发现原官方镜像站设定的每小时只能拉取10个镜像的限制(猜测可能对github出口ip进行了加白)
  • 稳定:只需要部署成功,即可稳定使用
  • 使用便捷:该方案看起来步骤复杂,但作者对其进行了脚本封装(支持windows、linux和mac),配置完成后,所有步骤可浓缩为一句类似原生命令的docker_pull 镜像tag即可拉取镜像

2. 方案配置

在使用前需要先进行配置,配置分为3个步骤:阿里云个人镜像仓库配置、git仓库配置、脚本配置

环境依赖:

  • git,并配置账号密码或密钥(推荐)
  • 阿里云账号,并实名。若无,可去阿里云官方网站注册一个
  • docker

2.1 阿里云个人镜像仓库申请

  1. 开通容器镜像服务 首先访问https://cr.console.aliyun.com/cn-shanghai/instance/namespaces ,若不存在镜像仓库,则会弹窗提示你开通:

image

点击前往开通,选择离你机器地理位置最近的地域,勾选使用须知,点击立即创建即可:

image

  1. 设置镜像仓库登录密码

服务开通后,界面会出现指引,点击设置Registry登录密码按钮即可:

image 若界面没有该显示,可点击左侧导航栏的访问凭证设置:

image 记住这里设置的密码,后续会用到。 注意:若想要共享搭建的服务,这里的仓库密码最好和阿里云账户密码不一致

  1. 创建命名空间

点击左侧导航栏的命名空间,然后点击创建命名空间按钮,输入一个独特的命名空间名称后点击确定:

image

记住该命名空间名称,后续配置会用到。

  1. 记录登录凭证

点击左侧导航栏的登录凭证,记下仓库地址,后续配置会用到:

image

2.2 git仓库配置

  1. fork仓库 fork开源仓库https://github.com/you8023/docker_images_sync 到自己git账号(可以的话帮忙点个start就更好了^-^)

注1:若是 fork 项目,由于 GitHub 安全策略限制,需在 GitHub 个人fork后的仓库界面 Actions 确认风险提示,才能在后面脚本中能够通过 GitHub Actions 自动构建

注2:若希望拉取的镜像tag保密,需自行创建权限为private的仓库,并将自己创建的私密仓库克隆到本地,复制本仓库文件,拷贝到本地私密仓库后push到github

注3:若希望配置的服务给好友分享使用,可在设置中的Collaborators处邀请好友(需好友同意邀请):

image

  1. 配置仓库全局变量

依次点击Settings -> Secrets and Security -> Actions,点击New respository secret按钮添加仓库变量:

image

添加以下4个全局变量:

  • DOCKER_USER:阿里云账户
  • DOCKER_PWD:2.1中第2步设置的阿里云镜像仓库密码
  • DOCKER_REGISTRY:2.1中第4步中记住的登录凭证页面中的仓库地址
  • DOCKER_NS:2.1中第3步创建的命名空间名称

添加后应能看到:

image

  1. 克隆仓库

来到自己fork的仓库,复制地址,使用git clone xxx克隆仓库到本地

2.3 脚本配置

  1. 复制本地仓库中的cmd/conf.yaml.default文件并命名为cmd/conf.yaml
  2. 编辑cmd/conf.yaml ,配置说明如下:
registry: 阿里云个人镜像仓库地址,形如:crpi-xxx.cn-xxx.personal.cr.aliyuncs.com
namespace: 阿里云个人镜像仓库命名空间名称
images_dir: git仓库路径,例如:"E:\Git\docker_images_sync"
max_retries: 拉取镜像重试次数,默认为60
retry_delay: 拉取镜像尝试间隔(秒),默认为1
first_delay: 将镜像tag提交后等待多久开始尝试拉取镜像(秒),默认为20
  1. 打开cmd或bash终端,登录阿里云镜像仓库,登录后会自动记住密码:
docker login <阿里云个人镜像仓库地址>
  1. 添加脚本目录到环境变量中

配置脚本到系统环境变量,使得可以在任意路径下使用docker_pull命令。这里根据自己的操作系统选取对应的配置方式:

windows系统

  1. 在文件夹左侧右键单击此电脑,选择属性
  2. 在弹出的对话框中点击高级系统设置
  3. 在弹出的对话框中点击环境变量
  4. 在弹出的对话框中找到Path变量,点击编辑
  5. 在弹出的对话框右侧点击新建,添加cmd目录路径,例如:E:\Git\docker_images_sync\cmd

image

Linux系统

  1. 对docker_pull脚本添加执行权限(其中的路径需替换为自己的):
sudo chmod +x /home/dubito/git/docker_images_sync/cmd/docker_pull
  1. 使用命令编辑~/.bashrc:
sudo vim ~/.bashrc

将以下语句添加到文件中(其中的路径需替换为自己git仓库下cmd目录的路径):

export PATH=$PATH:/home/dubito/git/docker_images_sync/cmd
  1. 执行命令使配置生效:
source ~/.bashrc

Mac系统

  1. 对docker_pull脚本添加执行权限(其中的路径需替换为自己的):
sudo chmod +x /Users/dubito/git/docker_images_sync/cmd/docker_pull
  1. 使用命令编辑配置文件: 针对默认shell为zsh(macOS Catalina 10.15及其之后的版本):
sudo vi ~/.zshrc

注:若Mac版本为macOS Catalina 10.15之前的版本(默认shell为bash),则使用以下命令:

sudo vi ~/.bash_profile

将以下语句添加到文件中(其中的路径需替换为自己git仓库下cmd目录的路径):

export PATH=$PATH:/home/dubito/git/docker_images_sync/cmd
  1. 使用source命令使配置生效:
source ~/.zshrc

注:若Mac版本为macOS Catalina (10.15)之前的版本,则使用以下命令:

source ~/.bash_profile

补充说明:若Mac中同时使用bash和zsh(例如使用idea的terminal执行docker_pull 提示命令不存在),则需兼容配置:

  1. 将上述修改应用于~/.bash_profile文件
  2. 使用命令编辑zsh的默认配置文件sudo vi ~/.zshrc,添加以下内容:
source ~/.bash_profile
  1. 执行命令使配置生效:
source ~/.zshrc

3. 方案使用

配置完毕后,在任意目录下使用命令即可正常拉取镜像:

docker_pull mysql:8.0.1

也可通过空格分隔一次性拉取多个镜像:

docker_pull mysql:8.0.1 mcp/elasticsearch:latest bitnami/redis:8.0.2-debian-12-r3

拉取成功如图所示:

image

image

注:如果拉取失败,可以在github查看工作流状态和日志:

image

图中为尝试拉取一个不存在的镜像:

image

注:若首次执行docker_pull命令后,github上未触发workflows工作流,则表明被安全策略拦截(fork 仓库默认不运行上游配置的workflow),需在github上配置显式启用Actions并授权Secrets访问:

  1. 打开github上fork后的仓库,点击上方Actions标签,在出现的界面中点击确认风险提示
  2. 再次使用docker_pull命令测试工作流是否正常触发

About

docker镜像一键拉取,无需梯子/服务器,无数量限制docker images sync workflow and scripts

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •