【问题标题】:Pulling CPU arch agnostic Docker images拉取与 CPU 架构无关的 Docker 镜像
【发布时间】:2019-12-11 23:53:56
【问题描述】:

Docker hub 会记录它支持的 CPU 架构(amd64、arm32v5、arm32v6、arm32v7、arm64v8 等)。但是,我似乎需要指定特定于架构的图像名称才能使用它们。

例如 busybox:latest 拉取 amd64 (link) 而不是我当前的拱门。我在 Raspberry PI (arm32v7) 上,它的图像在用户 arm32v7 (link) 下,所以图像名称是 arm32v7/busybox:latest

这意味着如果我想在多个架构上运行我的容器,我需要为每个架构创建不同的配置(例如 docker-compose 或 k8s 部署文件)。我想要一个隐藏架构差异的单一配置,并希望 Docker 有一种方法可以根据 Docker 引擎的运行位置提取特定于架构的图像。

这可能吗?

这是我的环境的一些输出。

docker version

Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:37:22 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:31:17 2019
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

docker info

Client:
 Debug Mode: false

Server:
 Containers: 41
  Running: 20
  Paused: 0
  Stopped: 21
 Images: 17
 Server Version: 19.03.5
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.19.75-v7l+
 Operating System: Raspbian GNU/Linux 10 (buster)
 OSType: linux
 Architecture: armv7l
 CPUs: 4
 Total Memory: 3.814GiB
 Name: raspberrypi
 ID: EDO4:EH5V:KIKR:WJE7:VQX4:FXZA:VROQ:3EE3:FEOU:42Q5:TXKI:3HPX
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No swap limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support

uname -a

Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux

【问题讨论】:

  • 这两个完全不相关(在 docker 意义上),不同的容器。不清楚你问什么。如果您询问如何“根据 Docker 引擎的位置提取特定于拱门的图像”,则由您编写脚本,而不是在 docker 端。 Docker看不到架构,对于docker来说这些只是文件。arm32v7/busybox镜像是arm32v7制作的,和官方的busybox不一样。
  • @KamilCuk。也许 Busybox 是一个不好的例子。除了我需要这个容器作为依赖项并且遇到了拱形差异问题外,我不太了解它的作用。说 Postgres 容器。无论 Postgres 是安装在 x86 还是基于 ARM 的机器上,Postgres 的功能在各种架构中都应该几乎相同。是的,我可以编写一个脚本来提取正确的图像,但奇怪的是,这是由用户而不是 Docker 引擎处理的。指定 arch 似乎取决于实现而不是接口。

标签: linux docker docker-compose arm


【解决方案1】:

Docker 支持多架构(多平台)镜像。但它需要原生多架构镜像,这需要更复杂的 docker 构建过程。如果镜像支持多架构,那么 Docker 会根据本地架构拉取正确的架构。

通常,基本的官方操作系统映像已经实现了多架构支持 - https://www.docker.com/blog/docker-official-images-now-multi-platform/

但是,大多数 Docker 映像仅支持单一架构。

其实busybox是多架构镜像:

$ docker manifest inspect busybox | grep -E ".*(architecture|variant).*"
            "architecture": "amd64",
            "architecture": "arm",
            "variant": "v5"
            "architecture": "arm",
            "variant": "v6"
            "architecture": "arm",
            "variant": "v7"
            "architecture": "arm64",
            "variant": "v8"
            "architecture": "386",
            "architecture": "ppc64le",
            "architecture": "s390x",

但是您的架构(arm32v7 - 也许是armv7)在那里不可用 - 它会拉取默认的amd64 版本。因此,此图像需要进行小幅改进以支持您的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多