Daniel Wang
Daniel Wang

Reputation: 131

What is the difference between below two docker commands?

I'm trying use MacBook M1 with docker build Go project, this project depends on lib confluent-kafka-go, thus must use below ways.

Both works, but what's the difference?
What I can see, first one use multi-platform image, second one use a special amd64/golang image.

docker run --platform linux/amd64 --rm -v $PWD:/build -w /build -e GOOS=linux -e GOARCH=amd64 golang:1.17-buster go build
docker run --rm -v "$PWD":/build -w /build -e GOOS=linux -e GOARCH=amd64 amd64/golang:1.17 go build

Upvotes: 2

Views: 112

Answers (1)

VonC
VonC

Reputation: 1328192

That would be the difference between ""Shared" and "Simple" tags":

  • "Simple Tags" are instances of a "single" Linux or Windows image.
    It is often a manifest list that can include the same image built for other architectures; for example, mongo:4.0-xenial currently has images for amd64 and arm64v8.
    The Docker daemon is responsible for picking the appropriate image for the host architecture.

  • "Shared Tags" are tags that always point to a manifest list which includes some combination of potentially multiple versions of Windows and Linux images across all their respective images' architectures -- in the mongo example, the 4.0 tag is a shared tag consisting of (at the time of this writing) all of 4.0-xenial, 4.0-windowsservercore-ltsc2016, 4.0-windowsservercore-1709, and 4.0-windowsservercore-1803.

So:

  • The "Simple Tags" enable docker run mongo:4.0-xenial to "do the right thing" across architectures on a single platform (Linux in the case of mongo:4.0-xenial).
  • The "Shared Tags" enable docker run mongo:4.0 to roughly work on both Linux and as many of the various versions of Windows that are supported (such as Windows Server Core LTSC 2016, where the Docker daemon is again responsible for determining the appropriate image based on the host platform and version).

In your case, the Docker Golang image offers both tags

  • golang:1.17-buster is a shared tag, from which you are extracting the linux/amd64 through the --platform option.
    If you did not specify the platform, would get a warning like:

    The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested

  • amd64/golang:1.17 is a simple tag, already tailored to linux/amd64

Upvotes: 2

Related Questions