docker / docker/cli

Why Do ARMv8 and ARMv9 Images Both Appear Only as arm64?

Open
#6,568 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

kind/bug status/0-triage
Dominant language
Go
Stars
6.1k
Forks
2.2k
Avg merge
1d 15h
Merged PRs (30d)
43

Description

Description

System Information

Gracehopper
~$ lscpu
Architecture:             aarch64
  CPU op-mode(s):         64-bit
  Byte Order:             Little Endian
CPU(s):                   72
  On-line CPU(s) list:    0-71
Vendor ID:                ARM
  Model name:             Neoverse-V2


~$ hostnamectl
Operating System: Ubuntu 22.04.5 LTS                  
          Kernel: Linux 6.8.0-1025-nvidia-64k
    Architecture: arm64
 Hardware Vendor: Supermicro
  Hardware Model: ARS-111GL-NHR

~$ docker --version
Docker version 28.0.4, build b8034c0

~$ which docker
/usr/bin/docker

$ snap list docker
error: no matching snaps installed
Jetson
~$ hostnamectl
Operating System: Ubuntu 22.04.5 LTS                  
          Kernel: Linux 5.15.136-tegra
    Architecture: arm64
 Hardware Vendor: NVIDIA
  Hardware Model: NVIDIA Jetson AGX Orin Developer Kit

~$ lscpu
Architecture:            aarch64
  CPU op-mode(s):        32-bit, 64-bit
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               ARM
  Model name:            Cortex-A78AE

~$ docker --version
Docker version 28.4.0, build d8eb465

~$ which docker
/usr/bin/docker

~$ snap list docker
error: no matching snaps installed

Building Images

Jetson
$ docker build -t my-alpine-app .
$ docker tag my-alpine-app dockerhubuser/test-alpine:jetsonV8
$ docker push dockerhubuser/test-alpine:jetsonV8
Gracehopper
$ docker build -t my-alpine-app .
$ docker tag my-alpine-app dockerhubuser/test-alpine:gracehopperNeoverseV2
$ docker push dockerhubuser/test-alpine:gracehopperNeoverseV2

Both images were built from the same simple Dockerfile shown below:

$ cat Dockerfile 
FROM alpine:3.18
WORKDIR /app
COPY . /app

DockerHub

Image

On Docker Hub, both images appear simply as linux/arm64, without specifying a variant.
But when I check official images such as Alpine, the variant is shown as v8.

  • Since Gracehopper uses ARMv9 (Neoverse V2), why isn’t the variant reflected (e.g., v9)?
  • Is v8 currently considered the default for arm64, and v9 not yet officially recognized by Docker Hub/OCI specs?
  • Is there a way to explicitly set or detect the v9 variant when building and pushing images?

Multi-Architecture Build

I also experimented with a multi-architecture build targeting three platforms: amd64, Gracehopper (ARMv9), and Jetson (ARMv8).

System Information for x86-64
~$ hostnamectl
Operating System: Ubuntu 24.04.1 LTS              
          Kernel: Linux 6.8.0-60-generic
    Architecture: x86-64
 Hardware Vendor: Dell Inc.

~$ lscpu
Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          43 bits physical, 48 bits virtual
  Byte Order:             Little Endian
CPU(s):                   64
  On-line CPU(s) list:    0-63
Vendor ID:                AuthenticAMD
  Model name:             AMD EPYC 7282 16-Core Processor

~$ docker --version
Docker version 28.1.1, build 4eba377

~$ which docker
/usr/bin/docker

~$ docker buildx version
github.com/docker/buildx v0.23.0 28c90ea
Building Images
docker buildx build   --target oai-lmf   --tag dockerhubuser/oai-lmf:gh-jetson   --platform linux/amd64,linux/arm64/v8,linux/arm64   --file docker/Dockerfile.lmf.ubuntu   --builder gh-jetson-multiarchbuilder   --progress=plain   --push . 2>&1 | tee LMF_log_multiarch_buildx.log

When explicitly specifying platforms like this:

--platform linux/amd64,linux/arm64/v8,linux/arm64/v9

the build ran for about 45 minutes (roughly 3× longer than the same Dockerfile on a single architecture) before failing.

If I instead use:

--platform linux/amd64,linux/arm64/v8,linux/arm64

Even though this warning appears, the build still completes and the image is pushed to Docker Hub — but without any variant being shown (only linux/arm64).

1 warning found (use docker --debug to expand):
 - Duplicate platform result requested "linux/arm64"
Reproduce
$ cat Dockerfile 
FROM alpine:3.18
WORKDIR /app
COPY . /app

Build the above image, from both Jetson and Gracehopper; and push to dockerhub

$ docker build -t my-alpine-app .
$ docker tag my-alpine-app dockerhubuser/test-alpine:jetsonV8
$ docker push dockerhubuser/test-alpine:jetsonV8

$ docker build -t my-alpine-app .
$ docker tag my-alpine-app dockerhubuser/test-alpine:gracehopperNeoverseV2
$ docker push dockerhubuser/test-alpine:gracehopperNeoverseV2
Expected behavior

Docker is treating image build on Gracehopper ARM Neoverse v9 as only arm64 and not with the variant

docker version
Gracehopper:


~$ docker version
Client: Docker Engine - Community
 Version:           28.0.4
 API version:       1.48
 Go version:        go1.23.7
 Git commit:        b8034c0
 Built:             Tue Mar 25 15:07:33 2025
 OS/Arch:           linux/arm64
 Context:           default


Jetson


~$ docker version
Client: Docker Engine - Community
 Version:           28.4.0
 API version:       1.51
 Go version:        go1.24.7
 Git commit:        d8eb465
 Built:             Wed Sep  3 20:58:58 2025
 OS/Arch:           linux/arm64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.4.0
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.24.7
  Git commit:       249d679
  Built:            Wed Sep  3 20:58:58 2025
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
docker info
Gracehopper


$ docker info
Client: Docker Engine - Community
 Version:    28.0.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.22.0
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.34.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 2
  Running: 2
  Paused: 0
  Stopped: 0
 Images: 35
 Server Version: 28.0.4
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2 nvidia
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 753481ec61c7c8955a23d6ff7bc8e4daed455734
 runc version: v1.2.5-0-g59923ef
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.8.0-1025-nvidia-64k
 Operating System: Ubuntu 22.04.5 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 72
 Total Memory: 478.5GiB


Jetson:


~$ docker info
Client: Docker Engine - Community
 Version:    28.4.0
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.27.0
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.39.2
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 13
 Server Version: 28.4.0
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 nvidia runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05044ec0a9a75232cad458027ca83437aae3f4da
 runc version: v1.2.5-0-g59923ef
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.15.136-tegra
 Operating System: Ubuntu 22.04.5 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 12
 Total Memory: 61.37GiB
Additional Info

No response

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

No source file or test is named. Start by reproducing the shown docker build and buildx build commands with linux/arm64, linux/arm64/v8, and linux/arm64/v9, then inspect the pushed manifest metadata and the duplicate-platform warning. Done means the ARM variant behavior is explained or a confirmed, scoped fix is identified.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, go
Domain
build-system, cli
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.