是否可以将多操作系统映像从一个 docker 注册表复制到 Linux 计算机上的另一个?

2023-12-06

我需要一种方法将我的清单和所有相关的 blob/等从私有注册表复制到公共注册表,其中图像以前从未被推送到公共注册表。

我通过以下方式成功创建了多架构清单buildah。请注意,虽然图像是使用 buildah 构建的,但我对基于 docker 的方法在注册表之间复制最终结果感到满意。这是输出buildah inspect:

{
    "schemaVersion": 2,
    "manifests": [
        {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:e1c1de1b56adc07e5a97970b3340b1cf71c02796eb4e27c638634b6bcf0e510e",
            "size": 5590,
            "platform": {
                "architecture": "amd64",
                "os": "windows"
            }
        },
        {
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "digest": "sha256:c4bf2b94bbedceab3888544f4b966e8c1435231daeff27546acaf3b817485226",
            "size": 511,
            "platform": {
                "architecture": "amd64",
                "os": "linux"
            }
        }
    ]
}

实际上,还会有更多的排列......但这个简单的清单说明了问题。

出于性能(以及其他各种)原因,我的 CI 将此映像推送到本地注册表。一旦我测试了最终清单,我想将其推向公众docker.io具有相同标签的注册表。

在将 Windows 添加到组合中之前,我能够通过拉取每个映像、使用新注册表重新标记它并推送来完成此任务。就像是...

buildah manifest create docker.io/img/name:latest

# Retag & add windows...
buildah pull myreg/img/name:windows
buildah tag myreg/img/name:windows docker.io/img/name:windows
buildah push docker.io/img/name:windows
buildah manifest add docker.io/img/name:latest docker.io/img/name:windows

# ... other variants ...

不幸的是,这不适用于 Windows。当 Linux 计算机尝试拉取 Windows 映像时,我收到以下错误:

Error committing the finished image: error adding layer with blob "sha256:0363fe57a309a0e39c3dd1bb7be80beed88dcef74b1773ee1a37f6caf81e0fe2": Error processing tar file(exit status 1): link /Files/Program Files/common files/Microsoft Shared/Ink/en-US/micaut.dll.mui /Files/Program Files (x86)/common files/Microsoft Shared/ink/en-US/micaut.dll.mui: no such file or directory

我是否需要使用 Windows 计算机进行重新标记位,将映像从本地复制到公共注册表?或者是否有一种简单的方法可以复制/镜像整个清单,而不添加所有这些额外的拉/标记/推步骤?


对于注册表之间的复制,您可以使用注册表 API,而无需与 docker 引擎或任何其他容器运行时交互。这些图像是 OCI 图像规范中描述的 json 清单和压缩的 tar blob,并且 API 对注册表上的图像的访问现在由 OCI 分发规范涵盖。

其中最复杂的部分通常是处理可能因注册表服务器而异的身份验证,否则可以使用各种curl 和 jq 命令在 shell 脚本中相当轻松地实现。我最终制作了自己的工具来处理这个确切的用例,可以在github.com/regclient/regclient。对于您的具体请求,您可以运行:

regctl image copy myreg/img/name:latest docker.io/img/name:latest

我认为实现这些功能的类似工具包括 RedHat 的 skopeo 和 Google 的 Crane(他们的 go-containerregistry 项目的一部分)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将多操作系统映像从一个 docker 注册表复制到 Linux 计算机上的另一个? 的相关文章

随机推荐

  • 将(自定义)解码器添加到 WebMVC 端点

    我有一个 WebMVC 端点 RequestMapping path execution id method RequestMethod POST public ResponseEntity lt gt execute PathVariab
  • Android socket.io 在不丢失连接的情况下切换活动

    我开发了一个游戏 它将使用socket io连接 我的服务器是用node js编写的 我的android客户端使用socket io 现在 我的问题是 我如何在不失去与服务器连接的情况下切换活动 我至少有 4 个活动 聊天 游戏视图 在线玩
  • Cordova ios 上的 Ajax 调用 SecurityError: DOM Exception 18

    您好 我正在通过 Cordova 5 1 1 Phonegap 构建 iOS 应用程序 但有一个无法解决的问题 A basic Ajax调用抛出一个SecurityError DOM Exception 18我尝试了有关白名单的所有技巧 但
  • MySQL:如何对 ORDER BY 子句使用 CASE

    我有一个存储过程 必须在根据输入过滤行后返回一个表 其中两个输入是sort column and sort dir 查询必须 ORDER BYsort column in the sort dir方向 ASC 或 DESC 我尝试过以下查询
  • 在 Mac 上的 SwiftUI 中处理“打开方式”中的多个 URL

    在 SwiftUI 中 我们被赋予了onOpenURL 执行 功能 但是 在 macOS 中 我们可以在 Finder 中选择多个文件 然后单击 打开方式 如果我使用带有以下代码的应用程序打开这些文件 main struct testURL
  • 康威的生命游戏更新(下一代)

    我正在研究 Conway 的生命游戏 java 代码 并且我正在与我的更新方法 也称为下一代创建者 作斗争 我将发布我迄今为止编写的代码 请让我知道我可以做什么来修复更新方法 如果在 T 时刻没有细胞 就会诞生一个细胞 1 并且它的三个邻居
  • EnableRaisingEvents 是否可以在应用程序启动时已在运行的进程上使用?

    目前我有一个程序启动另一个应用程序并监视该应用程序以使用以下代码保持其运行 System Diagnostics Process startProgram System Diagnostics Process Start program e
  • C++:在构造函数中初始化变量的位置[重复]

    这个问题在这里已经有答案了 可能的重复 C 初始化列表 选项 1 与选项 2 初始化变量的优缺点是什么 class MyClass public MyClass float f char a private float mFloat cha
  • SQL Server:合并性能

    我有一个包含 500 万行的数据库表 聚集索引是自增标识列 还有PK是生成256字节的代码VARCHAR这是 URL 的 SHA256 哈希值 这是表上的非聚集索引 表格如下 CREATE TABLE dbo store image ima
  • 方法始终从 Firestore DB 查询返回 false

    我有一种方法可以检查列表是否包含用户 由于某种原因它总是返回 false 即使用户位于列表中 该函数确实有效 我知道它确实找到了用户 只是不确定为什么它不返回任何其他内容 但false 我知道它有效 因为我有另一种方法使用此代码片段来检查用
  • 展开一项时折叠所有其他 Recyclerview 项目

    我有一个设置良好的可扩展回收器视图 单击任何项 目时 它会展开以显示更多详细信息 但我想在这里改变一下 单击一项展开时 所有其他项都应折叠 这是我的适配器代码 public class DataAdapter extends Recycle
  • 403 - 授权错误 - OAuth2.0 - 访问令牌 - Azure Api For Fhir

    我已使用此链接部署并配置了适用于 FHIR 的 Azure API https learn microsoft com en gb azure healthcare apis tutorial web app fhir server 使用邮
  • 方程有不同数量的参数

    我创建了这些数据类型来代表吉他标签 我正在尝试编写show功能将它们打印为真正的吉他谱 data这不是我的专长 我在匹配类型时遇到了困难 错误是 show 的方程有不同数量的参数 在 GHC Show Show Tabs Chord 的实例
  • MySQL解释行数限制

    下面是我的查询 用于获取类型 ID 为 1 的 20 行 EXPLAIN SELECT FROM content WHERE genre id 1 AND category 1 LIMIT 20 我在内容表中总共有 654 行 类型 id
  • WooCommerce 根据产品类别替换购物车/结帐中的“延期交货可用”

    我编写了一些代码 用于在基于产品类别的产品详细信息页面上显示自定义缺货消息 function custom backorder message text product if product gt managing stock produc
  • 如何不在 FacetGrid 中共享轴

    我正在尝试在数据框中绘制 KDE 的每一列df 最后一列是一个布尔值 我通过使用它在每个图表上绘制两种色调 sns pairplot df hue last palette True FF0000 False 0000FF diag kin
  • Serilog:如何进一步增强 appsettings.json 中的过滤器表达式?

    我有两个带有 Serilog 的记录器 它们保存到不同的文件 我想通过 appsettings json 而不是代码创建记录器 当我通过创建记录器时Startup cs配置后 我会得到更具体的日志 我更喜欢这样 因为它更清晰 并且允许其他人
  • ThreadPool.QueueUserWorkItem 使用 ASP.Net

    在Asp Net中使用 ThreadPool QueueUserWorkItem 创建巨大的pdf报告 我的要求是必须异步创建报告 并且我不想等待响应 我计划通过下面的代码来实现 protected void Button1 Click o
  • Java 中的 URL 连接 (FTP) - 简单问题

    我有一个简单的问题 我正在尝试用 Java 将文件上传到我的 ftp 服务器 我的计算机上有一个文件 我想复制该文件并上传 我尝试手动将文件的每个字节写入输出流 但这不适用于复杂的文件 例如 zip 文件或 pdf 文件 File file
  • 是否可以将多操作系统映像从一个 docker 注册表复制到 Linux 计算机上的另一个?

    我需要一种方法将我的清单和所有相关的 blob 等从私有注册表复制到公共注册表 其中图像以前从未被推送到公共注册表 我通过以下方式成功创建了多架构清单buildah 请注意 虽然图像是使用 buildah 构建的 但我对基于 docker