DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案[最佳实践]

发布于:2025-05-21 ⋅ 阅读:(17) ⋅ 点赞:(0)

图片

Docker将容器化技术普及,推动云计算向云原生的演进。Docker的核心创新技术之一是容器镜像,它是一种文件的打包方式,将应用程序运行的操作系统、库、运行环境等依赖全部打包一起。在其他任意环境,只要可以运行docker服务,就可以基于该镜像运行容器,即业务程序。

与GitHub托管代码的定位类似,Docker Hub 是一个开放性的容器镜像托管平台。由于其是最早的在线镜像存储和分发的平台,绝大多数的开源项目镜像都在该平台上托管。

容器镜像本质还是对文件的一种组织管理方式,具有传播数据和信息的能力,因此对于其分发的文件内容需要符合地方的法律法规,在没有完成合规的要求前应该无法直接面向国内提供服务。

鉴于DockerHub是绝对权威和全面的容器镜像托管平台,无法使用托管在该平台上优质的镜像,绝对是国内信息科技业的重大损失。

一种简单合规的镜像同步到国内方案

该方案核心是基于 GitHub Action功能,通过触发Action流水线执行容器镜像的拉取和推送。(GitHub目前可访问:Github是否在调试和预演封禁中国IP用户?我们又该怎样应对?

藏云阁 ImageToTo 开源项目(https://gitea.cncfstack.com/cncfstack/imagetoto)就是该方案的实现,大家也可以通过提交issue或在论坛,或微信群反馈需要同步的镜像,合并 push 时就会自动同步。

ImageToTo项目核心代码只有 Action 中的 10 来行代码。

源代码如下:


name: imageToTo
on:
  push:
    branches: [ "main" ]
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run a multi-line script
        run: |
          sudo docker login  --username=${{ secrets.HARBOR_USER }} --password=${{ secrets.HARBOR_PWD }} harbor.cloud.cncfstack.com
          for img in `cat image.list`
          do
              sudo docker pull $img
              if [ $? -ne 0 ];then
                  echo "pull error $img" >>  tmpfile
                  continue
              fi
              sudo docker tag $img harbor.cncfstack.com/$img
              sudo docker push harbor.cncfstack.com/$img
          done
          if [ -f tmpfile ];then
             cat tmpfile
          fi

源代码的逻辑

  1. 登陆国内镜像仓库

  2. 用Github Action流水线 docker pull 拉取镜像

  3. 通过 docker tag 将镜像tag修改为国内镜像仓库的地址信息

  4. 执行 docker push 将镜像推送到国内镜像仓库。

这个项目在配置时有两点需要注意,image.list 文件中填写 DockerHub 的镜像完整地址和国内镜像仓库的密码安全保密问题。

关于image.list 文件中填写 DockerHub 的镜像完整地址,主要是考虑项目的兼容性,因为到目前为止实际上已经有多个镜像托管平台了,如 Google 的gcr.io,Github的 ghcr.io ,以及一些开源项目自建的镜像仓库。

# cat image.list 
docker.io/library/nginx:1.26

另外一个需要注意的就是国内镜像仓库的账号和密码需要保密,这是通过Github的 secrets 配置管理的。

#组织或项目settings
->settings
  ->security
      ->secrets and variables
           ->Actions
              ->secrets

配置后只能通过Action执行流水线时读取使用,用户在管理页面和流水线日志中都无法查看该 secret 内容信息。配置示例:

图片

在项目的 Action 文件中使用如下语法应用

--password=${{ secrets.HARBOR_PWD }}

通过在 image.list 中添加镜像地址列表,执行 push 后在国内的镜像仓库中就可以查看和使用了。

如图是国内 Harbor 的日志信息,说明镜像已经成功推送过来了。

图片

在使用时,只需要在镜像前面添加国内镜像仓库地址即可拉取镜像

docker pull harbor.cncfstack.com/docker.io/library/nginx:1.26

图片

关于国内镜像仓库的选择

镜像仓库可以选择公有云的“容器镜像服务”,开箱即用。但是在实际使用时“个人免费版本”无法使用完整功能,会有很多限制。

最无法接受的就是“多级仓库目录”无法使用,该功能限制会直接导致脚本兼容性极差。

图片

所以,经过分析评估还是选择基于开源 Harbor 搭建企业私有的容器镜像仓库相对合适。当然,如果企业有采购公有云的容器镜像仓库服务企业版本,也是可以的。

使用 Harbor 搭建的镜像仓库可以创建很多不同的项目来区分不同镜像托管平台,也没有目录层级等限制,如图示例

图片

关于 Harbor 仓库的安装部署实际非常简单,后续的文章会进行快捷部署的介绍。


网站公告

今日签到

点亮在社区的每一天
去签到