macos – 构建并推送多拱形泊坞窗图像

前端之家收集整理的这篇文章主要介绍了macos – 构建并推送多拱形泊坞窗图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试根据在Raspbian和Mac OS X / Debian上运行的官方postgres图像制作自定义图像.

当我做的时候

来自postgres:10.4并构建了Dockerfile,似乎docker隐式选择了postgres的x64版本,然后只根据该架构构建了一个新的图像.

因此,当我将图像推送到我的GitLab注册表并再次下载时,它不起作用.它抛出一个standard_init_linux.go:190:exec用户进程导致“exec格式错误”,我认为这是另一种说错误架构的方式.

从我在https://blog.docker.com/2017/09/docker-official-images-now-multi-platform/收集的内容来看,在一个图像中支持多种架构使其成为“多拱”.然而,尽管资源很多,但对于我如何构建自己的多拱形图像以及需求是什么并不明显.

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

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

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

最佳答案
您需要为特定体系结构构建每个图像,然后生成清单,该清单是每个图像的列表.执行第二部分的命令目前是实验性的. 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命令在构建过程中生成一个临时容器来运行请求的命令,这将无法工作.我知道为另一个架构提取图像的唯一原因是将该图像转发到可以使用它们的另一个位置(私有注册表或导出scp),或者用于构建如上所述的多架构清单.

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之类的步骤以将文件添加到新映像,那么您可以在单个主机上创建所有内容.当上游图像是多拱时,您需要深入挖掘并找到用于上游图像的平台特定标记.有几种选择.困难的选择是检查多arch标记的清单以查看特定的摘要

$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","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.

猜你在找的Docker相关文章