- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试根据官方 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/
我需要将 OCI 镜像 list 转换为 Docker v2.2 镜像格式,反之亦然。但我找不到两者之间的任何区别,是否有任何实际区别或它们相同? 最佳答案 Docker 镜像 list V 2,模式
LNMP 是代表 Linux 系统下的 Nginx、Mariadb、PHP 相结合而构建成的动态网站服务器架构。下面使用docker制作分布式lnmp 镜像。 1、docker 分布式 lnmp
你好,我创建了一个基础镜像;但是,每当我运行 docker build . 时,我都看不到成功构建 我的 docker 文件 FROM centos:7 ARG user=john ARG home=
我想要我的 iPhone 应用程序中有一个功能,可以将图像转换为类似镜像的方式。 就像如果有一个左手举起的人的图像,那么转换后的图像必须有右手举起的同一个人。 任何代码或链接将不胜感激 预先感谢您的帮
我们希望将一个Elasticsearch集群放置在kubernetes集群的顶部(当前有2个节点,但是我们计划增加它)。 是否可以通过使集群中的每个节点包含相同数据的方式配置elasticsearch
我试图了解 docker 如何在文件系统上存储图像和图层。构建图像时,图层出现在 /var/lib/docker/image/overlay2/layerdb 中,图像出现在 /var/lib/doc
所以我最近开始使用 docker,因为我认为让我的网站 dockerised 会很好。我有一个 super 简单的 docker-compose.yml 文件,其中仅包含 wordpress:late
我有一个 docker 镜像,叫它 dockerimage/test。每次我更新它时,我都会增加一个标签,所以 dockerimage/test:1、dockerimage/test:2 等等。 当我
我开始使用 Docker,我发现我可以将主图像存储库放在不同的磁盘上(符号链接(symbolic link)/var/lib/docker 到其他位置)。 但是,现在我想看看是否有办法将它拆分到多个磁
显然应用程序打包和部署似乎有两种做法 创建 Docker 镜像并部署它 从头开始构建和部署应用程序。 我对如何使用选项 1) 感到困惑。前提是你获取一个 docker 镜像并在任何平台上重复使用它。但
我有一个 UIView具有透明背景和一些按钮。我想捕获 View 的绘图,将其缩小,然后在屏幕上的其他位置重新绘制(镜像)它。 (在另一个 View 之上。)按钮可以更改,因此它不是静态的。 最好的方
我正在为一个项目编写测试,我想测试和验证一个 docker 镜像构建。但我不想推送图像。 我希望图像构建在 CI(如 taskcluster)上并运行测试。 最佳答案 您需要使用 taskcluste
我想复制每个 html 页面中的代码,同时添加一些更改: 例子: Any text (even if includes :., 输出: Any text (even if includes :.,
我使用三星 ARM Cortex A9 Exynos4412 板。我在板上启动“linux + Qt”img。但是板上没有包管理器,也没有 make 、 gcc 命令。在/bin 文件中有文件 Bus
是否有可能以某种方式设置一个 git 存储库,该存储库像通常的 --mirror 一样用于 pull 入它,但在将从推送到另一个存储库时没有强制? 最佳答案 您可以像这样添加 --no-force 来
背景 最近在巡检过程中,发现harbor存储空间使用率已经达到了80%。于是,去看了一下各项目下的镜像标签数。发现有个别项目下的镜像标签数竟然有好几百个。细问之下得知,该项目目前处于调试阶段
以下均在centos 7进行的操作 docker安装 ? 1
我知道如何删除 N 天前创建的旧 Docker 镜像。 See here 但我真正想做的是删除过去 N 天未使用的旧 Docker 镜像。 目标是保留经常使用的图像,即使在我进行清理时没有容器实际使用
我有一个自定义的 docker 镜像,已经构建好了。没有可用的 Dockerfile。在容器内部,可以使用自定义用户,而不是 root,比如 test。此用户已附加到组 test。这是容器的默认用户。
我有一个开发数据库,我想将其提交到 docker 镜像中,然后推送到私有(private)存储库并用于本地开发和 CI 构建。 数据库保存为SQL备份,我可以通过将备份文件映射到官方镜像的/doc
我是一名优秀的程序员,十分优秀!