日前,Docker 向所有创建了 “组织” 的 Docker Hub 用户发出一封电子邮件,提醒称如果不升级至付费团队计划,他们的账户乃至所有镜像都将被删除。邮件中还随附一条 PDF 说明文件链接。但由于邮件和文件都很简短、缺乏细节,因此给整个开源维护者群体带来了巨大的冲击和焦虑情绪。
据我们所知,此次决定只会影响开源社区内的活跃组织账户。个人账户不受影响,免费个人账户将被保留 6 个月。
我先为大家解释一下相关情况:
  1. 付费团队需要每年支付 420 美元(按月支付)
  2. 包括我个人维护的项目在内,众多开源项目多年来一直通过 Docker Hub 发布镜像
  3. Docker 的开源计划充满了敌意和脱节操作
在具体讨论之前,我先介绍一下自己。
我是 Docker 最铁杆的拥护者之一,曾在他们的活动中发表演讲、为他们的项目做出贡献,也是他们影响力志愿者计划 “Docker Captains” 的忠实成员。我写过几十篇关于 Docker 技术的文章和大量代码示例。
我也绝对不是那种坚决反对为软件和服务付费的人。我自己的个人账户都开了付费,不是因为要借此发布镜像,而是因为我需要 pull 镜像。熟悉开源贡献的朋友应该知道,Go 或者 Node。js 基础镜像都是日常工作中经常需要用到的。
我个人跟 Docker 的新任 CTO 已经认识多年,所以真的很惊讶现在他们与用户之间的沟通居然如此脱节。
下面咱们就来一条条分析,再看看有哪些备选工具和解决办法。
#01
当前问题
组织托管公共镜像的成本将从 0 美元/上涨到 420 美元/。但很多开源项目获得的资金支持其实很少,甚至根本没有。如果 Docker 出手限制私有 repo,那我还能理解,毕竟这些东西本身也没对开源社区直接做什么贡献;退一步讲,如果是对声明发布之后新增的 “组织” 收费,我也可以接受。但很遗憾,打击范围是全方位的。
多年以来,很多开源项目一直在以这种方式向 Docker Hub 发布镜像,OpenSaaS 最早可以追溯到 2016 年。曾几何时,任何人都可以抢注镜像发布恶意内容。OpenSaaS 项目如今虽然将免费的社区版镜像发布至 GitHub 的 Container Registry,但仍有很多用户在继续使用 Docker Hub 上的几千种旧镜像。Docker 明显是在挟镜像以令开源,如果我们不付钱,很多免费用户的系统就会崩溃
Docker 制定的开源计划充满了敌意和脱节操作。可以说,除了业余项目和完全被捐赠给开源基金会的项目,任何其他项目都得向 Docker 交钱
“不得商业化。你的组织不可通过收取服务费或其他形式的费用来获利。仅允许以接受捐赠的方式维持项目运转。”
在随后的邮件中,Docker 的语言有所缓和,但我认为这只是为了降低开源社区的反抗强度。
开源向来缺钱,而 Docker 也正诞生于开源。我们这个开源社区就是孕育出 Docker 王国的土壤,现在他们赚到了钱之后却数典忘祖,反过来想把社区变成新的利润来源。
#02
解决办法
Docker 公司 CTO 曾在 Twitter 上做出非正式评论,表示他们会关闭不付费的账户,而且不允许任何其他人接管账户。够狠,我想看看 Docker 会不会以书面形式公布这项决定。
理想的情况是,这些账户将继续与用户挂钩,只要愿意付费,就随时可以将其恢复。
但对于自己维护的很多项目,我早就开始把开源包发布到 GitHub 的 Container Reigstry 上了。为什么呢?因为 Docker 搞了个天怒人怨的速率限制,任何从 Docker Hub 下载内容的用户都得交钱 —— 无论是个人用户还是企业用户。我也花了一笔钱,这样才能快速下载 Prometheus、NATS、Go、Python 和 Node.js 等镜像。
唯一的希望:获得 “开源” 认证资质
如果大家维护的项目归云原生计算基金会(CNCF)或者 Apache 基金会所有,那可以直接申请 Docker 的开源免费计划。但如果你只是个独立开源贡献者,或者项目有其他资金来源或可持续性的财务支持途径,那 Docker 就要向你 “征税” 了。
我们举个例子,Daniel Stenberg 维护着一个大名鼎鼎的项目 ——curl,每台 Mac 和 Linux 计算机上都能看到它的身影,Docker 自己肯定也在用。但 Daniel 名下还有一家咨询公司,从事定制化开发。这样一个互联网核心基础项目,在 Docker 眼中明显是不符合 “开源” 认定的。
虽然提供开源豁免条款,但要求非常严苛(绝对不得「商业化」—— 不得对外提供服务、不得接受赞助商赞助、不得发布付费插件,后续也不得采取任何本质上属于这几类情况的其他盈利措施),而且往往需要一年以上才能对应用程序完成审查。
抢先注册
如果大家手速够快,也可以先删除自己的组织再飞速创建成免费的个人账户。这样应该能够保留原本的项目名称,同时防止恶意人士冒名顶替。
但一旦项目体量过大,这个办法就不太可行了,毕竟删除组织和所有镜像会造成比较严重的影响。
如果大家确实能忍受一定的停机时间,那可以尝试以下操作:
  • 创建新的个人用户账户;
  • 保存新用户账户所需要的全部镜像和标签;
  • 删除原有组织;
  • 将个人用户账户重新命名为组织名称。
将镜像发布至 GitHub
GitHub 的 Container Registry 为公共镜像提供免费存储服务。另外,因为它能生成短期令牌来访问 ghcr.io,所以大家不必将服务账户或长期令牌以 secrets 的形式保存在 CI 当中。
如果大家已经在 GitHub 上存储过镜像,并打算使用 GitHub 的内置 GITHUB_TOKEN 来发布新标签,则需要前往 Package 并编辑写入权限。在添加 repo 时附上 “Write” 访问权限即可。
注意,千万别错过工作流文件中的 “permissions” 权限部分。
使用 GITHUB_TOKEN 为现有 repo 设置写入权限
迁移现有镜像
谷歌提供的 crane 工具能够以优于 docker pull、tag 和 push 的效率实现镜像保存。另外,pull、tag 和 push 方法也不适用于多架构镜像。
以下是列出镜像标签的示例命令:
crane  ls  ghcr.io/openfaas/gateway  |  tail  -n  5


0.26.1

c26ec5221e453071216f5e15c3409168446fd563

0.26.2

a128df471f406690b1021a32317340b29689c315  0.26.3

这里的 crane cp 命令不需要本地 Docker 守护进程,可以直接在注册表间完成复制:
crane  cp  docker.io/openfaas/gateway:0.26.3

ghcr.io/openfaas/gateway:0.26.3
#03
总结
自从 Docker Hub 开始对 Go、Prometheus 和 NATS 等公共开源镜像设置限速时,很多开源项目就已经在逐渐逃离。我自己仍然保留了一个 Docker 付费账户,目的就是继续使用这些镜像。
我并不反对 Docker 赚钱,我自己就是付费用户,我也鼓励其他人付费。但我觉得 Docker 的沟通方式和效果都糟糕透顶,给很多最忠诚、最支持他们的社区用户制造了焦虑,同时暴露出了他们对于开源可持续性问题的虚伪态度。
既然说到了 GitHub,那这一边到底可不可靠?
我昨天刚刚跟一位客户聊过,他们对我方的产品和服务都很满意。但在首周 PoC 期间,GitHub 频繁发生中断和故障,导致项目意外停摆。
我们只能希望 GitHub 管理层能多重视一下,还我们一套稳定可靠的托管平台。
Docker 一步步成了今天的样子,可能我们每个开源贡献者都没想到。但 GitHub 又何尝不是呢?在刚刚被微软收购时,人们还是相信 GitHub 扎实可靠,不会轻易做出伤害开源社区的决定。但现实并非如此,GitHub 甚至取消了一切通过 PayPal 向项目维护者支付的赞助。他们出手很快,再加上全球经济衰退的整体影响,如今开源工作者的日子真的很艰难。
如果 GitHub 最终也成了现在的 Docker,我们该怎么办?
这确实也是个客观存在的风险,我甚至觉得问题的核心在于 “什么时候”、而不在于 “会不会”。就在几年前,Travis CI 还是开源项目的软件构建和协作平台,但现在已经没什么动静了。
这里我只能尽自己的绵薄之力做出呼吁 —— 请不要忽视开源维护者付出的努力。他们已经在日以继夜地工作,拿不到什么报酬或投资,但却始终在为整个社区服务。而且就像当初 Travis CI 背弃我们一样,现在 Docker 也与自己的开源土壤渐行渐远。
最后,让我们以一条推文作结:
Docker 的意思,是不是如果我们不注册付费计划,Docker Hub 上的开源 OpenSaaS 组织就会被删除?
那 Prometheus 乃至 Docker Hub 上的各个开源组织呢,是不是终有一天也会面临同样的困境?
推荐阅读:

布式实验室策划的《Kubernetes实战集训营》正式上线了。这门课程通过通过5天线上培训,40个小时直播,15个随堂练习,50天课后辅导,把Kubernetes的70多个重要知识点讲给你,并通过实战帮你掌握Kubernetes。培训重实战、重项目、更贴近工作,边学边练,5月13日正式开课。
继续阅读
阅读原文