草庐IT

macos - 构建并推送多拱 docker 镜像

coder 2023-05-27 原文

我正在尝试根据官方 postgres 图像制作自定义图像,该图像适用于 Raspbian 和 Mac OS X/Debian。

当我做一个

来自 postgres:10.4 并构建 Dockerfile,似乎 docker 隐式选择了 postgres 的 x64 版本,然后仅基于该架构构建新图像。

因此,当我将图像推送到我的 GitLab 注册表并再次下载时,它不起作用。它抛出一个standard_init_linux.go:190: exec user process caused "exec format error",我认为这是错误架构的另一种说法。

据我所知,https://blog.docker.com/2017/09/docker-official-images-now-multi-platform/ ,在一个图像中支持多种架构使其成为“多拱门”。然而,尽管有很多资源,但对我来说如何构建自己的多架构镜像以及要求是什么并不明显。

理想情况下,我希望能够从 Raspberry Pi/Raspbian 主机和 Mac/Debian 主机无缝构建和推送 armv7 和 x64 版本。

我发现了这个问题:Cross-compile multi-arch containers

其中一个答案暗示了一个过程。但是,该进程不支持使用 RUN 命令的 dockerfiles,这是我的项目的要求。

最佳答案

您需要为特定架构构建每个镜像,然后生成一个 list ,其中包含每个镜像的列表。执行第二部分的命令目前是实验性的。 documentation shows this example (尽管大多数人倾向于将架构放在标签名称中,例如 myrepo/myapp:arm-linux-v1):

$ docker manifest create 45.55.81.106:5000/coolapp:v1 \
    45.55.81.106:5000/coolapp-ppc64le-linux:v1 \
    45.55.81.106:5000/coolapp-arm-linux:v1 \
    45.55.81.106:5000/coolapp-amd64-linux:v1 \
    45.55.81.106:5000/coolapp-amd64-windows:v1
Created manifest list 45.55.81.106:5000/coolapp:v1

$ docker manifest annotate 45.55.81.106:5000/coolapp:v1 45.55.81.106:5000/coolapp-arm-linux --arch arm

$ docker manifest push 45.55.81.106:5000/coolapp:v1
Pushed manifest 45.55.81.106:5000/coolapp@sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426 with digest: sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f with digest: sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a
Pushed manifest 45.55.81.106:5000/coolapp@sha256:39dc41c658cf25f33681a41310372f02728925a54aac3598310bfb1770615fc9 with digest: sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f91b1145cd4ac800b28122313ae9e88ac340bb3f1e3a4cd3e59a3648650f3275 with digest: sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62
sha256:050b213d49d7673ba35014f21454c573dcbec75254a08f4a7c34f66a47c06aba

要配置具有实验性功能的 docker 客户端,您可以在本地 $HOME/.docker/config.json 中设置以下内容:

{
   "auths": { ... },
   "experimental": "enabled"
}

请注意,如果您执行了 docker 登录,则可能已经配置了 auths 部分。除了在右括号后添加逗号之外,您应该保持该部分不变。如果您没有 auths 部分,请从文件中排除该行。


However, the process won't support dockerfiles using the RUN command, which is a requirement for my project.

您可以下载不同架构的镜像,但无法从错误的架构运行这些镜像。 RUN 命令在构建过程中生成一个临时容器来运行请求的命令,这根本不起作用。我知道为另一个架构拉取镜像的唯一原因是将该镜像中继到另一个可以使用它们的位置(私有(private)注册表,或导出 + scp),或者用于构建多架构 list ,如您在上面看到的。


The point here is to build for multiple architectures on a single host. I have seen blog posts using QEMU to achieve this, but they all use different base images for each architecture. It is not clear how to do this when the base image is a multi-arch image already.

如果您可以在没有任何 RUN 步骤的情况下构建图像,则对图像之外的任何二进制文件使用交叉编译器,并且仅执行 COPY 之类的步骤将文件添加到您的新图像,然后您可以在单个主机上创建所有内容。当上游镜像是多架构时,您需要更深入地挖掘并找到一个特定于平台的标签以用于您的上游镜像。有几种选择。困难的选择是检查多架构标签的 list 以查看特定的摘要:

$ docker manifest inspect busybox
{                    
   "schemaVersion": 2,                                                                       
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [                     
      {                  
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 527,
         "digest": "sha256:bbb143159af9eabdf45511fd5aab4fd2475d4c0e7fd4a5e154b98e838488e510",
         "platform": {                                                       
            "architecture": "amd64",
            "os": "linux"                                                                    
         }            
      },                            
      {                  
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 527,
         "digest": "sha256:3d1b11fb001ece2e99556690ce064b07851649582b1f0907649c21e65ba4298f",
         "platform": {
            "architecture": "arm",                                                                                                           
            "os": "linux",                                                                           
            "variant": "v5"
         }                                                                     
      },
...

然后您可以使用特定的摘要标记,例如 busybox@sha256:3d1b11fb001ece2e99556690ce064b07851649582b1f0907649c21e65ba4298f。要以编程方式执行此操作,您可以使用 jq 解析输出:

docker manifest inspect busybox | \
  jq '.manifests | .[] | select(.platform.architecture == "arm64") | .digest'

但是,大多数多架构镜像都包含针对各个架构的标签。因此,您将选择该特定标签而不是多拱标签。对于官方图像,docker 目前有架构特定的 repos documented in their official images repo .

关于macos - 构建并推送多拱 docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51400625/

有关macos - 构建并推送多拱 docker 镜像的更多相关文章

  1. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  4. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  5. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  6. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  7. ruby - Ruby 语言可以用来构建操作系统吗? - 2

    Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby​​解释器作为独立内核加载到内存中。一旦ruby​​解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大

  8. ruby - gem 推送结果为 "package metadata is missing" - 2

    我正在尝试将我更新的gem推送到ruby​​gems.com并得到以下结果。~/dev/V2/V2GPTI(master)$gembuildv2gpti.gemspecSuccessfullybuiltRubyGemName:v2gptiVersion:0.2File:v2gpti-0.2-universal-darwin-13.gem~/dev/V2/V2GPTI(master)$gempushv2gpti.gemspecERROR:Whileexecutinggem...(Gem::Package::FormatError)packagemetadataismissinginv2g

  9. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  10. ruby - 找不到 macOS Mojave 'ruby/config.h' 文件 - 2

    当我尝试在macOSMojave(10.14.1)上构建带有ruby​​支持(--enable-rubyinterp)的vim(8.1.0509)时,出现错误:Infileincludedfrom/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby.h:33:/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/ruby.h:24:10:fatalerror:'ru

随机推荐