diff mbox series

automation: set architecture in docker files

Message ID 20231113155701.52052-1-roger.pau@citrix.com (mailing list archive)
State New, archived
Headers show
Series automation: set architecture in docker files | expand

Commit Message

Roger Pau Monne Nov. 13, 2023, 3:57 p.m. UTC
Pass the desired architecture of the image in the FROM instruction if the
image is possibly multi-platform.

This allows using the x86 Dockerfiles on OS X on arm64 hardware.

No functional change intended.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
I haven't touched the Yocto dockerfile because I'm not sure how it's used.
---
 automation/build/alpine/3.18.dockerfile               | 2 +-
 automation/build/archlinux/current-riscv64.dockerfile | 2 +-
 automation/build/archlinux/current.dockerfile         | 2 +-
 automation/build/centos/7.dockerfile                  | 2 +-
 automation/build/debian/bookworm.dockerfile           | 2 +-
 automation/build/debian/bullseye-ppc64le.dockerfile   | 2 +-
 automation/build/debian/buster-gcc-ibt.dockerfile     | 2 +-
 automation/build/debian/jessie.dockerfile             | 2 +-
 automation/build/debian/stretch.dockerfile            | 2 +-
 automation/build/fedora/29.dockerfile                 | 2 +-
 automation/build/suse/opensuse-leap.dockerfile        | 2 +-
 automation/build/suse/opensuse-tumbleweed.dockerfile  | 2 +-
 automation/build/ubuntu/bionic.dockerfile             | 2 +-
 automation/build/ubuntu/focal.dockerfile              | 2 +-
 automation/build/ubuntu/trusty.dockerfile             | 2 +-
 automation/build/ubuntu/xenial-xilinx.dockerfile      | 2 +-
 automation/build/ubuntu/xenial.dockerfile             | 2 +-
 17 files changed, 17 insertions(+), 17 deletions(-)

Comments

Stefano Stabellini Nov. 14, 2023, 12:10 a.m. UTC | #1
On Mon, 13 Nov 2023, Roger Pau Monne wrote:
> Pass the desired architecture of the image in the FROM instruction if the
> image is possibly multi-platform.
> 
> This allows using the x86 Dockerfiles on OS X on arm64 hardware.
> 
> No functional change intended.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>

Although I am not opposed to this change, so far we have been using:
arm64v8/alpine:3.18

for x86 it is not specified but it would be:
amd64/alpine:3.18

Two options:
1) we add amd64/ everywhere and leave the arm containers alone
2) we change all containers, including the arm containers, to use the
--platform option

I don't think is a good idea to have 2 different ways to specify the
architecture for x86 and arm containers



> ---
> I haven't touched the Yocto dockerfile because I'm not sure how it's used.
> ---
>  automation/build/alpine/3.18.dockerfile               | 2 +-
>  automation/build/archlinux/current-riscv64.dockerfile | 2 +-
>  automation/build/archlinux/current.dockerfile         | 2 +-
>  automation/build/centos/7.dockerfile                  | 2 +-
>  automation/build/debian/bookworm.dockerfile           | 2 +-
>  automation/build/debian/bullseye-ppc64le.dockerfile   | 2 +-
>  automation/build/debian/buster-gcc-ibt.dockerfile     | 2 +-
>  automation/build/debian/jessie.dockerfile             | 2 +-
>  automation/build/debian/stretch.dockerfile            | 2 +-
>  automation/build/fedora/29.dockerfile                 | 2 +-
>  automation/build/suse/opensuse-leap.dockerfile        | 2 +-
>  automation/build/suse/opensuse-tumbleweed.dockerfile  | 2 +-
>  automation/build/ubuntu/bionic.dockerfile             | 2 +-
>  automation/build/ubuntu/focal.dockerfile              | 2 +-
>  automation/build/ubuntu/trusty.dockerfile             | 2 +-
>  automation/build/ubuntu/xenial-xilinx.dockerfile      | 2 +-
>  automation/build/ubuntu/xenial.dockerfile             | 2 +-
>  17 files changed, 17 insertions(+), 17 deletions(-)
> 
> diff --git a/automation/build/alpine/3.18.dockerfile b/automation/build/alpine/3.18.dockerfile
> index 5d2a69a06010..4ae9cb5e9e30 100644
> --- a/automation/build/alpine/3.18.dockerfile
> +++ b/automation/build/alpine/3.18.dockerfile
> @@ -1,4 +1,4 @@
> -FROM alpine:3.18
> +FROM --platform=linux/amd64 alpine:3.18
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/archlinux/current-riscv64.dockerfile b/automation/build/archlinux/current-riscv64.dockerfile
> index abf8e7bf0b88..af75b5c720ce 100644
> --- a/automation/build/archlinux/current-riscv64.dockerfile
> +++ b/automation/build/archlinux/current-riscv64.dockerfile
> @@ -1,4 +1,4 @@
> -FROM archlinux
> +FROM --platform=linux/amd64 archlinux
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/archlinux/current.dockerfile b/automation/build/archlinux/current.dockerfile
> index 47e79637a4a6..d974a1434fd5 100644
> --- a/automation/build/archlinux/current.dockerfile
> +++ b/automation/build/archlinux/current.dockerfile
> @@ -1,4 +1,4 @@
> -FROM archlinux:base-devel
> +FROM --platform=linux/amd64 archlinux:base-devel
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/centos/7.dockerfile b/automation/build/centos/7.dockerfile
> index 69dcefb2f011..ab450f0b3a0e 100644
> --- a/automation/build/centos/7.dockerfile
> +++ b/automation/build/centos/7.dockerfile
> @@ -1,4 +1,4 @@
> -FROM centos:7
> +FROM --platform=linux/amd64 centos:7
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/debian/bookworm.dockerfile b/automation/build/debian/bookworm.dockerfile
> index ae008c8d46e5..ac87778b3972 100644
> --- a/automation/build/debian/bookworm.dockerfile
> +++ b/automation/build/debian/bookworm.dockerfile
> @@ -1,4 +1,4 @@
> -FROM debian:bookworm
> +FROM --platform=linux/amd64 debian:bookworm
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/debian/bullseye-ppc64le.dockerfile b/automation/build/debian/bullseye-ppc64le.dockerfile
> index 4de8458445ae..6fdfb6bc2b40 100644
> --- a/automation/build/debian/bullseye-ppc64le.dockerfile
> +++ b/automation/build/debian/bullseye-ppc64le.dockerfile
> @@ -1,4 +1,4 @@
> -FROM debian:bullseye-slim
> +FROM --platform=linux/amd64 debian:bullseye-slim
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/debian/buster-gcc-ibt.dockerfile b/automation/build/debian/buster-gcc-ibt.dockerfile
> index 96ab4fe8a2f1..4328c109b72b 100644
> --- a/automation/build/debian/buster-gcc-ibt.dockerfile
> +++ b/automation/build/debian/buster-gcc-ibt.dockerfile
> @@ -1,4 +1,4 @@
> -FROM debian:buster-slim AS builder
> +FROM --platform=linux/amd64 debian:buster-slim AS builder
>  
>  ENV DEBIAN_FRONTEND=noninteractive
>  ENV USER root
> diff --git a/automation/build/debian/jessie.dockerfile b/automation/build/debian/jessie.dockerfile
> index 63b2c1e5b771..db0962953c9a 100644
> --- a/automation/build/debian/jessie.dockerfile
> +++ b/automation/build/debian/jessie.dockerfile
> @@ -1,4 +1,4 @@
> -FROM debian/eol:jessie
> +FROM --platform=linux/amd64 debian/eol:jessie
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/debian/stretch.dockerfile b/automation/build/debian/stretch.dockerfile
> index 1af6c691f8f4..9f6c146f032c 100644
> --- a/automation/build/debian/stretch.dockerfile
> +++ b/automation/build/debian/stretch.dockerfile
> @@ -1,4 +1,4 @@
> -FROM debian:stretch
> +FROM --platform=linux/amd64 debian:stretch
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/fedora/29.dockerfile b/automation/build/fedora/29.dockerfile
> index e55b06a4517e..42a87ce6c84b 100644
> --- a/automation/build/fedora/29.dockerfile
> +++ b/automation/build/fedora/29.dockerfile
> @@ -1,4 +1,4 @@
> -FROM fedora:29
> +FROM --platform=linux/amd64 fedora:29
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/suse/opensuse-leap.dockerfile b/automation/build/suse/opensuse-leap.dockerfile
> index 7010b71acaa0..e1ec38a41445 100644
> --- a/automation/build/suse/opensuse-leap.dockerfile
> +++ b/automation/build/suse/opensuse-leap.dockerfile
> @@ -1,4 +1,4 @@
> -FROM opensuse/leap
> +FROM --platform=linux/amd64 opensuse/leap
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/suse/opensuse-tumbleweed.dockerfile b/automation/build/suse/opensuse-tumbleweed.dockerfile
> index 959e1f6939f0..38f6fda2ff1b 100644
> --- a/automation/build/suse/opensuse-tumbleweed.dockerfile
> +++ b/automation/build/suse/opensuse-tumbleweed.dockerfile
> @@ -1,4 +1,4 @@
> -FROM opensuse/tumbleweed
> +FROM --platform=linux/amd64 opensuse/tumbleweed
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/ubuntu/bionic.dockerfile b/automation/build/ubuntu/bionic.dockerfile
> index e15f54431efb..77d7f933860c 100644
> --- a/automation/build/ubuntu/bionic.dockerfile
> +++ b/automation/build/ubuntu/bionic.dockerfile
> @@ -1,4 +1,4 @@
> -FROM ubuntu:18.04
> +FROM --platform=linux/amd64 ubuntu:18.04
>  LABEL maintainer.name="The Xen Project " \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/ubuntu/focal.dockerfile b/automation/build/ubuntu/focal.dockerfile
> index e3d11194ee2f..30a9b8e84ffe 100644
> --- a/automation/build/ubuntu/focal.dockerfile
> +++ b/automation/build/ubuntu/focal.dockerfile
> @@ -1,4 +1,4 @@
> -FROM ubuntu:20.04
> +FROM --platform=linux/amd64 ubuntu:20.04
>  LABEL maintainer.name="The Xen Project " \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/ubuntu/trusty.dockerfile b/automation/build/ubuntu/trusty.dockerfile
> index 22e294c20cac..0d33578c4e1d 100644
> --- a/automation/build/ubuntu/trusty.dockerfile
> +++ b/automation/build/ubuntu/trusty.dockerfile
> @@ -1,4 +1,4 @@
> -FROM ubuntu:14.04
> +FROM --platform=linux/amd64 ubuntu:14.04
>  LABEL maintainer.name="The Xen Project" \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/ubuntu/xenial-xilinx.dockerfile b/automation/build/ubuntu/xenial-xilinx.dockerfile
> index 5f7087135213..49f27b322995 100644
> --- a/automation/build/ubuntu/xenial-xilinx.dockerfile
> +++ b/automation/build/ubuntu/xenial-xilinx.dockerfile
> @@ -1,4 +1,4 @@
> -FROM ubuntu:16.04
> +FROM --platform=linux/amd64 ubuntu:16.04
>  LABEL maintainer.name="The Xen Project " \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> diff --git a/automation/build/ubuntu/xenial.dockerfile b/automation/build/ubuntu/xenial.dockerfile
> index 2d2ba3e31f63..e8035434f804 100644
> --- a/automation/build/ubuntu/xenial.dockerfile
> +++ b/automation/build/ubuntu/xenial.dockerfile
> @@ -1,4 +1,4 @@
> -FROM ubuntu:16.04
> +FROM --platform=linux/amd64 ubuntu:16.04
>  LABEL maintainer.name="The Xen Project " \
>        maintainer.email="xen-devel@lists.xenproject.org"
>  
> -- 
> 2.42.0
>
Roger Pau Monne Nov. 14, 2023, 9:01 a.m. UTC | #2
On Mon, Nov 13, 2023 at 04:10:24PM -0800, Stefano Stabellini wrote:
> On Mon, 13 Nov 2023, Roger Pau Monne wrote:
> > Pass the desired architecture of the image in the FROM instruction if the
> > image is possibly multi-platform.
> > 
> > This allows using the x86 Dockerfiles on OS X on arm64 hardware.
> > 
> > No functional change intended.
> > 
> > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> 
> Although I am not opposed to this change, so far we have been using:
> arm64v8/alpine:3.18
> 
> for x86 it is not specified but it would be:
> amd64/alpine:3.18
> 
> Two options:
> 1) we add amd64/ everywhere and leave the arm containers alone
> 2) we change all containers, including the arm containers, to use the
> --platform option
> 
> I don't think is a good idea to have 2 different ways to specify the
> architecture for x86 and arm containers

I'm not an expert on this, but attempting to use (2):

-FROM arm64v8/alpine:3.18
+FROM --platform=linux/arm64v8 alpine:3.18

Does not work for me:

% make -C automation/build alpine/3.18-arm64v8
docker build --pull -t registry.gitlab.com/xen-project/xen/alpine:3.18-arm64v8 -f alpine/3.18-arm64v8.dockerfile alpine
[+] Building 1.4s (3/3) FINISHED                                                  docker:desktop-linux
 => [internal] load .dockerignore                                                                 0.0s
 => => transferring context: 2B                                                                   0.0s
 => [internal] load build definition from 3.18-arm64v8.dockerfile                                 0.0s
 => => transferring dockerfile: 818B                                                              0.0s
 => ERROR [internal] load metadata for docker.io/library/alpine:3.18                              1.4s
------
 > [internal] load metadata for docker.io/library/alpine:3.18:
------
3.18-arm64v8.dockerfile:1
--------------------
   1 | >>> FROM --platform=linux/arm64v8 alpine:3.18
   2 |     LABEL maintainer.name="The Xen Project" \
   3 |           maintainer.email="xen-devel@lists.xenproject.org"
--------------------
ERROR: failed to solve: alpine:3.18: no match for platform in manifest sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978: not found
make: *** [alpine/3.18-arm64v8] Error 1

That's why I've left the prefixed images alone.

I could prefix the x86 images with amd64/ if that's preferred, I
didn't try that option, as the Docker manual suggested using
--platform.

Thanks, Roger.
Anthony PERARD Nov. 14, 2023, 3 p.m. UTC | #3
On Tue, Nov 14, 2023 at 10:01:06AM +0100, Roger Pau Monné wrote:
> On Mon, Nov 13, 2023 at 04:10:24PM -0800, Stefano Stabellini wrote:
> > On Mon, 13 Nov 2023, Roger Pau Monne wrote:
> > > Pass the desired architecture of the image in the FROM instruction if the
> > > image is possibly multi-platform.
> > > 
> > > This allows using the x86 Dockerfiles on OS X on arm64 hardware.
> > > 
> > > No functional change intended.
> > > 
> > > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> > 
> > Although I am not opposed to this change, so far we have been using:
> > arm64v8/alpine:3.18
> > 
> > for x86 it is not specified but it would be:
> > amd64/alpine:3.18
> > 
> > Two options:
> > 1) we add amd64/ everywhere and leave the arm containers alone
> > 2) we change all containers, including the arm containers, to use the
> > --platform option
> > 
> > I don't think is a good idea to have 2 different ways to specify the
> > architecture for x86 and arm containers
> 
> I'm not an expert on this, but attempting to use (2):
> 
> -FROM arm64v8/alpine:3.18
> +FROM --platform=linux/arm64v8 alpine:3.18
> 
> Does not work for me:
> 
> % make -C automation/build alpine/3.18-arm64v8
> docker build --pull -t registry.gitlab.com/xen-project/xen/alpine:3.18-arm64v8 -f alpine/3.18-arm64v8.dockerfile alpine
> [+] Building 1.4s (3/3) FINISHED                                                  docker:desktop-linux
>  => [internal] load .dockerignore                                                                 0.0s
>  => => transferring context: 2B                                                                   0.0s
>  => [internal] load build definition from 3.18-arm64v8.dockerfile                                 0.0s
>  => => transferring dockerfile: 818B                                                              0.0s
>  => ERROR [internal] load metadata for docker.io/library/alpine:3.18                              1.4s
> ------
>  > [internal] load metadata for docker.io/library/alpine:3.18:
> ------
> 3.18-arm64v8.dockerfile:1
> --------------------
>    1 | >>> FROM --platform=linux/arm64v8 alpine:3.18
>    2 |     LABEL maintainer.name="The Xen Project" \
>    3 |           maintainer.email="xen-devel@lists.xenproject.org"
> --------------------
> ERROR: failed to solve: alpine:3.18: no match for platform in manifest sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978: not found
> make: *** [alpine/3.18-arm64v8] Error 1
> 
> That's why I've left the prefixed images alone.
> 
> I could prefix the x86 images with amd64/ if that's preferred, I
> didn't try that option, as the Docker manual suggested using
> --platform.

So a few things to know, "--platform=linux/amd64" just select a
different build of one container. For example, for the "alpine"
containers, you can see all the different builds available on the docker
hub, here a few links:
- Official Docker, Alpine images, home:
  https://hub.docker.com/_/alpine
- The different builds: 
  https://hub.docker.com/_/alpine/tags

So, for amd64v8, you probably want --platform=linux/arm64/v8

Then, they are per-architecture repository that make it easier to deal
with foreign architecture, and probably maintained by a different
community. e.g. for alpine arm64v8:
    https://hub.docker.com/r/arm64v8/alpine/

Those provide a build for a single architecture.


Sometime, you actually need to "--platform=*" to select a particular
architecture, like I did for "jessie-i386.dockerfile".


One thing I've notice when using --platform is that, if for example I
use the container "--platform=linux/amd64 alpine:3" then
"--platform=linux/arm/v6 alpine:3"; later when I only specify
"alpine:3", it's going to be the armv6, and I think docker is going to
complain if I try tu use "--platform=linux/amd64 alpine:3" without
"docker pull" first (or I guess docker build --pull).

Hope that help.

So I guess using containers "amd64/*" or "arm64v8/*" is fine, but
sometime will need to use "--platform=*".

Cheers,
Roger Pau Monne Nov. 14, 2023, 4:56 p.m. UTC | #4
On Tue, Nov 14, 2023 at 03:00:17PM +0000, Anthony PERARD wrote:
> On Tue, Nov 14, 2023 at 10:01:06AM +0100, Roger Pau Monné wrote:
> > On Mon, Nov 13, 2023 at 04:10:24PM -0800, Stefano Stabellini wrote:
> > > On Mon, 13 Nov 2023, Roger Pau Monne wrote:
> > > > Pass the desired architecture of the image in the FROM instruction if the
> > > > image is possibly multi-platform.
> > > > 
> > > > This allows using the x86 Dockerfiles on OS X on arm64 hardware.
> > > > 
> > > > No functional change intended.
> > > > 
> > > > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> > > 
> > > Although I am not opposed to this change, so far we have been using:
> > > arm64v8/alpine:3.18
> > > 
> > > for x86 it is not specified but it would be:
> > > amd64/alpine:3.18
> > > 
> > > Two options:
> > > 1) we add amd64/ everywhere and leave the arm containers alone
> > > 2) we change all containers, including the arm containers, to use the
> > > --platform option
> > > 
> > > I don't think is a good idea to have 2 different ways to specify the
> > > architecture for x86 and arm containers
> > 
> > I'm not an expert on this, but attempting to use (2):
> > 
> > -FROM arm64v8/alpine:3.18
> > +FROM --platform=linux/arm64v8 alpine:3.18
> > 
> > Does not work for me:
> > 
> > % make -C automation/build alpine/3.18-arm64v8
> > docker build --pull -t registry.gitlab.com/xen-project/xen/alpine:3.18-arm64v8 -f alpine/3.18-arm64v8.dockerfile alpine
> > [+] Building 1.4s (3/3) FINISHED                                                  docker:desktop-linux
> >  => [internal] load .dockerignore                                                                 0.0s
> >  => => transferring context: 2B                                                                   0.0s
> >  => [internal] load build definition from 3.18-arm64v8.dockerfile                                 0.0s
> >  => => transferring dockerfile: 818B                                                              0.0s
> >  => ERROR [internal] load metadata for docker.io/library/alpine:3.18                              1.4s
> > ------
> >  > [internal] load metadata for docker.io/library/alpine:3.18:
> > ------
> > 3.18-arm64v8.dockerfile:1
> > --------------------
> >    1 | >>> FROM --platform=linux/arm64v8 alpine:3.18
> >    2 |     LABEL maintainer.name="The Xen Project" \
> >    3 |           maintainer.email="xen-devel@lists.xenproject.org"
> > --------------------
> > ERROR: failed to solve: alpine:3.18: no match for platform in manifest sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978: not found
> > make: *** [alpine/3.18-arm64v8] Error 1
> > 
> > That's why I've left the prefixed images alone.
> > 
> > I could prefix the x86 images with amd64/ if that's preferred, I
> > didn't try that option, as the Docker manual suggested using
> > --platform.
> 
> So a few things to know, "--platform=linux/amd64" just select a
> different build of one container. For example, for the "alpine"
> containers, you can see all the different builds available on the docker
> hub, here a few links:
> - Official Docker, Alpine images, home:
>   https://hub.docker.com/_/alpine
> - The different builds: 
>   https://hub.docker.com/_/alpine/tags
> 
> So, for amd64v8, you probably want --platform=linux/arm64/v8

Interesting, I guess I was looking at an outdated documentation that
stated the tag as arm64v8 instead of arm64/v8.

> 
> Then, they are per-architecture repository that make it easier to deal
> with foreign architecture, and probably maintained by a different
> community. e.g. for alpine arm64v8:
>     https://hub.docker.com/r/arm64v8/alpine/
> 
> Those provide a build for a single architecture.

Right, so those two are not actually the same image.  I wonder whether
we would want to uniformly switch to using --platform when possible,
in order to make sure we are using the same (multi arch) image to
avoid surprises.

> 
> 
> Sometime, you actually need to "--platform=*" to select a particular
> architecture, like I did for "jessie-i386.dockerfile".
> 
> 
> One thing I've notice when using --platform is that, if for example I
> use the container "--platform=linux/amd64 alpine:3" then
> "--platform=linux/arm/v6 alpine:3"; later when I only specify
> "alpine:3", it's going to be the armv6, and I think docker is going to
> complain if I try tu use "--platform=linux/amd64 alpine:3" without
> "docker pull" first (or I guess docker build --pull).
> 
> Hope that help.
> 
> So I guess using containers "amd64/*" or "arm64v8/*" is fine, but
> sometime will need to use "--platform=*".

My take is that it's better to use --platform when possible, as then
all platforms share the same image, and the contents of the image
should be more consistent.

I guess we could see about switching some of the image that currently
use a prefix (like the Alpine one) in order to instead use --platform
and share the same image.  I wouldn't want to do it in this patch
however, as the change presented here should be non-functional, while
switching to the multi arch image might introduce changes.

Thanks, Roger.
Stefano Stabellini Nov. 14, 2023, 9:47 p.m. UTC | #5
On Tue, 14 Nov 2023, Roger Pau Monné wrote:
> On Tue, Nov 14, 2023 at 03:00:17PM +0000, Anthony PERARD wrote:
> > On Tue, Nov 14, 2023 at 10:01:06AM +0100, Roger Pau Monné wrote:
> > > On Mon, Nov 13, 2023 at 04:10:24PM -0800, Stefano Stabellini wrote:
> > > > On Mon, 13 Nov 2023, Roger Pau Monne wrote:
> > > > > Pass the desired architecture of the image in the FROM instruction if the
> > > > > image is possibly multi-platform.
> > > > > 
> > > > > This allows using the x86 Dockerfiles on OS X on arm64 hardware.
> > > > > 
> > > > > No functional change intended.
> > > > > 
> > > > > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> > > > 
> > > > Although I am not opposed to this change, so far we have been using:
> > > > arm64v8/alpine:3.18
> > > > 
> > > > for x86 it is not specified but it would be:
> > > > amd64/alpine:3.18
> > > > 
> > > > Two options:
> > > > 1) we add amd64/ everywhere and leave the arm containers alone
> > > > 2) we change all containers, including the arm containers, to use the
> > > > --platform option
> > > > 
> > > > I don't think is a good idea to have 2 different ways to specify the
> > > > architecture for x86 and arm containers
> > > 
> > > I'm not an expert on this, but attempting to use (2):
> > > 
> > > -FROM arm64v8/alpine:3.18
> > > +FROM --platform=linux/arm64v8 alpine:3.18
> > > 
> > > Does not work for me:
> > > 
> > > % make -C automation/build alpine/3.18-arm64v8
> > > docker build --pull -t registry.gitlab.com/xen-project/xen/alpine:3.18-arm64v8 -f alpine/3.18-arm64v8.dockerfile alpine
> > > [+] Building 1.4s (3/3) FINISHED                                                  docker:desktop-linux
> > >  => [internal] load .dockerignore                                                                 0.0s
> > >  => => transferring context: 2B                                                                   0.0s
> > >  => [internal] load build definition from 3.18-arm64v8.dockerfile                                 0.0s
> > >  => => transferring dockerfile: 818B                                                              0.0s
> > >  => ERROR [internal] load metadata for docker.io/library/alpine:3.18                              1.4s
> > > ------
> > >  > [internal] load metadata for docker.io/library/alpine:3.18:
> > > ------
> > > 3.18-arm64v8.dockerfile:1
> > > --------------------
> > >    1 | >>> FROM --platform=linux/arm64v8 alpine:3.18
> > >    2 |     LABEL maintainer.name="The Xen Project" \
> > >    3 |           maintainer.email="xen-devel@lists.xenproject.org"
> > > --------------------
> > > ERROR: failed to solve: alpine:3.18: no match for platform in manifest sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978: not found
> > > make: *** [alpine/3.18-arm64v8] Error 1
> > > 
> > > That's why I've left the prefixed images alone.
> > > 
> > > I could prefix the x86 images with amd64/ if that's preferred, I
> > > didn't try that option, as the Docker manual suggested using
> > > --platform.
> > 
> > So a few things to know, "--platform=linux/amd64" just select a
> > different build of one container. For example, for the "alpine"
> > containers, you can see all the different builds available on the docker
> > hub, here a few links:
> > - Official Docker, Alpine images, home:
> >   https://hub.docker.com/_/alpine
> > - The different builds: 
> >   https://hub.docker.com/_/alpine/tags
> > 
> > So, for amd64v8, you probably want --platform=linux/arm64/v8
> 
> Interesting, I guess I was looking at an outdated documentation that
> stated the tag as arm64v8 instead of arm64/v8.
> 
> > 
> > Then, they are per-architecture repository that make it easier to deal
> > with foreign architecture, and probably maintained by a different
> > community. e.g. for alpine arm64v8:
> >     https://hub.docker.com/r/arm64v8/alpine/
> > 
> > Those provide a build for a single architecture.
> 
> Right, so those two are not actually the same image.  I wonder whether
> we would want to uniformly switch to using --platform when possible,
> in order to make sure we are using the same (multi arch) image to
> avoid surprises.
> 
> > 
> > 
> > Sometime, you actually need to "--platform=*" to select a particular
> > architecture, like I did for "jessie-i386.dockerfile".
> > 
> > 
> > One thing I've notice when using --platform is that, if for example I
> > use the container "--platform=linux/amd64 alpine:3" then
> > "--platform=linux/arm/v6 alpine:3"; later when I only specify
> > "alpine:3", it's going to be the armv6, and I think docker is going to
> > complain if I try tu use "--platform=linux/amd64 alpine:3" without
> > "docker pull" first (or I guess docker build --pull).
> > 
> > Hope that help.
> > 
> > So I guess using containers "amd64/*" or "arm64v8/*" is fine, but
> > sometime will need to use "--platform=*".
> 
> My take is that it's better to use --platform when possible, as then
> all platforms share the same image, and the contents of the image
> should be more consistent.
> 
> I guess we could see about switching some of the image that currently
> use a prefix (like the Alpine one) in order to instead use --platform
> and share the same image.  I wouldn't want to do it in this patch
> however, as the change presented here should be non-functional, while
> switching to the multi arch image might introduce changes.

I am OK with any way forward as long as we are consistent across
architectures.

If you don't want to change the existing arm64v8 prefixes, I am fine
with that, but then I would ask you to use the amd64 prefix not to break
consistency (do not use --platform).

After that, if you prefer to use --platform, I am totally fine with that
too and it can be a follow-up patch changing the containers of both
architectures.
diff mbox series

Patch

diff --git a/automation/build/alpine/3.18.dockerfile b/automation/build/alpine/3.18.dockerfile
index 5d2a69a06010..4ae9cb5e9e30 100644
--- a/automation/build/alpine/3.18.dockerfile
+++ b/automation/build/alpine/3.18.dockerfile
@@ -1,4 +1,4 @@ 
-FROM alpine:3.18
+FROM --platform=linux/amd64 alpine:3.18
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/archlinux/current-riscv64.dockerfile b/automation/build/archlinux/current-riscv64.dockerfile
index abf8e7bf0b88..af75b5c720ce 100644
--- a/automation/build/archlinux/current-riscv64.dockerfile
+++ b/automation/build/archlinux/current-riscv64.dockerfile
@@ -1,4 +1,4 @@ 
-FROM archlinux
+FROM --platform=linux/amd64 archlinux
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/archlinux/current.dockerfile b/automation/build/archlinux/current.dockerfile
index 47e79637a4a6..d974a1434fd5 100644
--- a/automation/build/archlinux/current.dockerfile
+++ b/automation/build/archlinux/current.dockerfile
@@ -1,4 +1,4 @@ 
-FROM archlinux:base-devel
+FROM --platform=linux/amd64 archlinux:base-devel
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/centos/7.dockerfile b/automation/build/centos/7.dockerfile
index 69dcefb2f011..ab450f0b3a0e 100644
--- a/automation/build/centos/7.dockerfile
+++ b/automation/build/centos/7.dockerfile
@@ -1,4 +1,4 @@ 
-FROM centos:7
+FROM --platform=linux/amd64 centos:7
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/debian/bookworm.dockerfile b/automation/build/debian/bookworm.dockerfile
index ae008c8d46e5..ac87778b3972 100644
--- a/automation/build/debian/bookworm.dockerfile
+++ b/automation/build/debian/bookworm.dockerfile
@@ -1,4 +1,4 @@ 
-FROM debian:bookworm
+FROM --platform=linux/amd64 debian:bookworm
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/debian/bullseye-ppc64le.dockerfile b/automation/build/debian/bullseye-ppc64le.dockerfile
index 4de8458445ae..6fdfb6bc2b40 100644
--- a/automation/build/debian/bullseye-ppc64le.dockerfile
+++ b/automation/build/debian/bullseye-ppc64le.dockerfile
@@ -1,4 +1,4 @@ 
-FROM debian:bullseye-slim
+FROM --platform=linux/amd64 debian:bullseye-slim
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/debian/buster-gcc-ibt.dockerfile b/automation/build/debian/buster-gcc-ibt.dockerfile
index 96ab4fe8a2f1..4328c109b72b 100644
--- a/automation/build/debian/buster-gcc-ibt.dockerfile
+++ b/automation/build/debian/buster-gcc-ibt.dockerfile
@@ -1,4 +1,4 @@ 
-FROM debian:buster-slim AS builder
+FROM --platform=linux/amd64 debian:buster-slim AS builder
 
 ENV DEBIAN_FRONTEND=noninteractive
 ENV USER root
diff --git a/automation/build/debian/jessie.dockerfile b/automation/build/debian/jessie.dockerfile
index 63b2c1e5b771..db0962953c9a 100644
--- a/automation/build/debian/jessie.dockerfile
+++ b/automation/build/debian/jessie.dockerfile
@@ -1,4 +1,4 @@ 
-FROM debian/eol:jessie
+FROM --platform=linux/amd64 debian/eol:jessie
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/debian/stretch.dockerfile b/automation/build/debian/stretch.dockerfile
index 1af6c691f8f4..9f6c146f032c 100644
--- a/automation/build/debian/stretch.dockerfile
+++ b/automation/build/debian/stretch.dockerfile
@@ -1,4 +1,4 @@ 
-FROM debian:stretch
+FROM --platform=linux/amd64 debian:stretch
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/fedora/29.dockerfile b/automation/build/fedora/29.dockerfile
index e55b06a4517e..42a87ce6c84b 100644
--- a/automation/build/fedora/29.dockerfile
+++ b/automation/build/fedora/29.dockerfile
@@ -1,4 +1,4 @@ 
-FROM fedora:29
+FROM --platform=linux/amd64 fedora:29
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/suse/opensuse-leap.dockerfile b/automation/build/suse/opensuse-leap.dockerfile
index 7010b71acaa0..e1ec38a41445 100644
--- a/automation/build/suse/opensuse-leap.dockerfile
+++ b/automation/build/suse/opensuse-leap.dockerfile
@@ -1,4 +1,4 @@ 
-FROM opensuse/leap
+FROM --platform=linux/amd64 opensuse/leap
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/suse/opensuse-tumbleweed.dockerfile b/automation/build/suse/opensuse-tumbleweed.dockerfile
index 959e1f6939f0..38f6fda2ff1b 100644
--- a/automation/build/suse/opensuse-tumbleweed.dockerfile
+++ b/automation/build/suse/opensuse-tumbleweed.dockerfile
@@ -1,4 +1,4 @@ 
-FROM opensuse/tumbleweed
+FROM --platform=linux/amd64 opensuse/tumbleweed
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/ubuntu/bionic.dockerfile b/automation/build/ubuntu/bionic.dockerfile
index e15f54431efb..77d7f933860c 100644
--- a/automation/build/ubuntu/bionic.dockerfile
+++ b/automation/build/ubuntu/bionic.dockerfile
@@ -1,4 +1,4 @@ 
-FROM ubuntu:18.04
+FROM --platform=linux/amd64 ubuntu:18.04
 LABEL maintainer.name="The Xen Project " \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/ubuntu/focal.dockerfile b/automation/build/ubuntu/focal.dockerfile
index e3d11194ee2f..30a9b8e84ffe 100644
--- a/automation/build/ubuntu/focal.dockerfile
+++ b/automation/build/ubuntu/focal.dockerfile
@@ -1,4 +1,4 @@ 
-FROM ubuntu:20.04
+FROM --platform=linux/amd64 ubuntu:20.04
 LABEL maintainer.name="The Xen Project " \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/ubuntu/trusty.dockerfile b/automation/build/ubuntu/trusty.dockerfile
index 22e294c20cac..0d33578c4e1d 100644
--- a/automation/build/ubuntu/trusty.dockerfile
+++ b/automation/build/ubuntu/trusty.dockerfile
@@ -1,4 +1,4 @@ 
-FROM ubuntu:14.04
+FROM --platform=linux/amd64 ubuntu:14.04
 LABEL maintainer.name="The Xen Project" \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/ubuntu/xenial-xilinx.dockerfile b/automation/build/ubuntu/xenial-xilinx.dockerfile
index 5f7087135213..49f27b322995 100644
--- a/automation/build/ubuntu/xenial-xilinx.dockerfile
+++ b/automation/build/ubuntu/xenial-xilinx.dockerfile
@@ -1,4 +1,4 @@ 
-FROM ubuntu:16.04
+FROM --platform=linux/amd64 ubuntu:16.04
 LABEL maintainer.name="The Xen Project " \
       maintainer.email="xen-devel@lists.xenproject.org"
 
diff --git a/automation/build/ubuntu/xenial.dockerfile b/automation/build/ubuntu/xenial.dockerfile
index 2d2ba3e31f63..e8035434f804 100644
--- a/automation/build/ubuntu/xenial.dockerfile
+++ b/automation/build/ubuntu/xenial.dockerfile
@@ -1,4 +1,4 @@ 
-FROM ubuntu:16.04
+FROM --platform=linux/amd64 ubuntu:16.04
 LABEL maintainer.name="The Xen Project " \
       maintainer.email="xen-devel@lists.xenproject.org"