无需VPS,使用重新打tag的方式 拉取、转存mcr.microsoft.com的镜像

使用Azure Devops的pipelines功能一键ReTag转存

Posted by 王帅 on January 17, 2020

引言

docker的都知道镜像加速,通过配置阿里云、腾讯云的镜像源确实可以大幅提升docker pull的效果,但对于某些不常用或新版的镜像却收效甚微。

比如最近想要部署私有ExceptionLess服务,它的dockerfile使用了mcr.microsoft.com/dotnet/core/sdk:2.2.401mcr.microsoft.com/dotnet/core/aspnet:2.2,这两个镜像拉取非常慢,只能使用手动tag的方式来解决。

另外,本人在腾讯云中创建了dotnet-core命名空间,源自mcr.microsoft.com可直接使用ccr.ccs.tencentyun.com/dotnet-core/runtime

image-20200415142923048

解决办法


2020-04-15更新

原标题为:使用travis-ci的Trigger build功能一键转存

但是本人多次实测,travis-ciBuild带宽限制严重,如果你要Retag Runtime还好,设置travis_wait 30基本也能用;但是如果是SDK,基本都会超时

Still running (50 of 300): sudo docker push ccr.ccs.tencentyun.com/dotnet-core/sdk:5.0
The job exceeded the maximum time limit for jobs, and has been terminated.

因此改用Azure Devops


2020-3-9更新:

使用Azure官方镜像mirror

根据此issue:dockerhub.azk8s.cn how to get the multiple path image,可使用mcr.azk8s.cn仓库替换mcr.microsoft.com,即,将mcr.microsoft.com/dotnet/core/aspnet:2.2替换为mcr.azk8s.cn/dotnet/core/aspnet:2.2

此方案只能在Azure中使用。。。


手动Tag

如果你有一台国外的VPS,那很简单;只需执行docker pulldocker logindocker tagdocker push就OK了。无奈我的VPS到期了,只能另寻它法,google之后从这篇文章找到灵感:使用重新打 tag 的方式,拉取 k8s.gcr.io 的镜像

使用Azure Devops

  • 首先,去腾讯云中创建保存image的仓库 image.png

  • 参考create-a-service-connection,在project→project settings →Service connections →New ervice connection中新建一个名为tencentyunDocker Registry,其中Docker Registry地址为:https://ccr.ccs.tencentyun.com/v2/,用户名和密码请查看腾讯云的镜像使用指引

image-20200415111820887

  • 在你项目里面的Piplines中新建一个连接到Github仓库的yml,创建模板随便选

image-20200415135902763

  • 最后把Review中的yml文件替换成如下:
trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

variables:
  tag: 'aspnet:5.0'

steps:
- task: [email protected]
  inputs:
    containerRegistry: 'tencentyun'
    command: 'login'
- task: [email protected]
  inputs:
    targetType: 'inline'
    script: |
      $env:version="$(tag)"
      
      docker pull mcr.microsoft.com/dotnet/core/$env:version
      
      docker tag mcr.microsoft.com/dotnet/core/$env:version ccr.ccs.tencentyun.com/dotnet-core/$env:version
      docker push ccr.ccs.tencentyun.com/dotnet-core/$env:version
  • 然后点击Save and run(或者也可以在自己的仓库中创建一个上述的azure-pipelines.yml文件,在Azure Devops中连接好后提交)就可以了

使用travis-ci自动Tag

travis-ciBuild带宽限制严重,已改用Azure Devops,以下步骤仅作参考


使用第三方的CI、CD服务push镜像到国内私有仓库中解决docker pull过慢的问题,本例的CI-CD使用的是travis-ci,由于自己使用了腾讯云的容器服务,因此私有库使用了腾讯云提供的免费镜像仓库。

  • 首先,去腾讯云中创建保存image的仓库 image.png
  • 其次,访问travis-ci,并授权其对自己git库的访问权限(随便什么仓库都行,因为我们并不需要使用里面的代码)
  • 参照腾讯云提供的镜像使用指引,编写.travis.yml脚本文件 image.png 我的脚本文件如下:
language: bash
env:
  - version=sdk:2.2
services:
  - docker
sudo: required
branches:
  only:
    - master
script:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin ccr.ccs.tencentyun.com
  - docker pull mcr.microsoft.com/dotnet/core/$version

after_success:
  - sudo docker tag mcr.microsoft.com/dotnet/core/$version ccr.ccs.tencentyun.com/dotnet-core/$version
  - sudo docker push ccr.ccs.tencentyun.com/dotnet-core/$version
  • travis-ci的首页上,任意选择一个仓库,然后在More OptionsSettings里面添加docker登陆的用户名密码环境变量DOCKER_USERNAMEDOCKER_PASSWORD

image-20200410113527361

  • More OptionsTrigger buildCUSTOM CONFIG中粘贴写好的.travis.yml脚本并点击Trigger custom build image.png
  • 稍等几分钟即可在job log中看到脚本的执行结果

这里并不会立即出结果,图示是因为images已经存在于ccr.ccs.tencentyun.com中了,所以给人以速度很快的假象

image.png

参考链接