Giter Site home page Giter Site logo

estesp / manifest-tool Goto Github PK

View Code? Open in Web Editor NEW
697.0 18.0 90.0 11.46 MB

Command line tool to create and query container image manifest list/indexes

License: Apache License 2.0

Makefile 3.00% Go 74.73% Shell 21.57% Dockerfile 0.70%
docker docker-registry docker-image docker-images multiplatform multiarch oci-image container-registry container-image container-images

manifest-tool's Introduction

manifest-tool

manifest-tool is a command line utility used to view or push multi-platform container image references located in an OCIv1 or Docker v2.2 compatible container registry.

While several other tools include more complete capabilities to view and manipulate the manifest objects associated with container images and artifacts, manifest-tool was created as one of the first command line tools capable of assembling "manifest lists" (Docker v2.2), now more commonly known as "indexes" in the OCIv1 image specification. Manifest lists or indexes exist for the purpose of combining an array of architecture and platform specific container image manifests under a single reference. This allows a container runtime to select the appropriate index entry that matches the local node's architecture and platform. Before these kinds of manifests were available it required separate instructions, configurations, or code changes to set up the appropriate platform-specific image reference depending on the platform in use.

Installation

The releases of manifest-tool are built using the latest Go version, and binaries for many architectures are available as pre-built binaries with each release, found on the GitHub releases page.

You can also use manifest-tool via an existing Docker image automatically generated for a large number of architectures with each release. To use this image simply run

$ docker run mplatform/manifest-tool

To build manifest-tool locally, clone this repository and build the binary as shown below. Note that you will need to have a recent version of the Go SDK installed on your system as well as make.

$ git clone https://github.com/estesp/manifest-tool
$ cd manifest-tool && make binary

If you don't want to install a local development environment but have Docker installed, you can use make build to build manifest-tool inside the official Go SDK container.

Additional targets make static target will build a statically-linked binary, and make cross will build a binary for all supported platforms using Go's cross-compilation capabilities.

Querying Manifests Without Installation

If you only have a requirement to query public image references to validate platform support you can use a related project, mquery, which allows remote querying of public registry images.

Use mquery by running it's DockerHub-located image, mplatform/mquery:latest, and specifying a target image to query, as shown in the example below:

$ docker run --rm mplatform/mquery mplatform/mquery:latest
Image: mplatform/mquery:latest (digest: sha256:d0989420b6f0d2b929fd9355f15c767f62d0e9a72cdf999d1eb16e6073782c71)
 * Manifest List: Yes (Image type: application/vnd.docker.distribution.manifest.list.v2+json)
 * Supported platforms:
   - linux/ppc64le
   - linux/amd64
   - linux/386
   - linux/s390x
   - linux/riscv64
   - linux/arm64/v8
   - linux/arm/v7
   - linux/arm/v6
   - windows/amd64:10.0.17763.2300
   - windows/amd64:10.0.14393.4770

The mquery program itself is a small Go program running as an AWS Lambda function using a small cache so recent image results are cached. More information is available in the mquery GitHub repo.

Outdated, but original, details on the creation of mquery are found in my blog post from the Moby Summit EU 2017 on this topic.

Sample Usage

manifest-tool can:

  • inspect manifests (of all media types) within any registry supporting the OCI distribution API
  • push manifest list/index objects to any registry which supports the OCI distribution API and the appropriate image (Docker or OCI) image specification.

Note: For pushing you will have to provide your registry credentials via either a) the command line, b) use a credential helper application (manifest-tool supports these in the same way Docker client does), or c) already be logged in to a registry and have an existing Docker client configuration file with credentials.

Inspect

Inspect/view the manifest of any image reference (repo/image:tag combination) with the inspect command. You must provide a tag, even if the tag is latest as the containerd resolver does not auto-append latest to image references and manifest-tool utilizes the containerd resolver library.

Example output of an inspect on a manifest list media type is shown below:

$ manifest-tool inspect golang:1.17
Name:   golang:1.17 (Type: application/vnd.docker.distribution.manifest.list.v2+json)
Digest: sha256:1a35cc2c5338409227c7293add327ebe42e1ee5465049f6c57c829588e3f8a39
 * Contains 10 manifest references:
[1]     Type: application/vnd.docker.distribution.manifest.v2+json
[1]   Digest: sha256:a6c0b3e8b7d2faed2415448f20e75ed26eed6fdb1d261873ed4205907d92c674
[1]   Length: 1796
[1] Platform:
[1]    -      OS: linux
[1]    -    Arch: amd64
[1] # Layers: 7
     layer 01: digest = sha256:0c6b8ff8c37e92eb1ca65ed8917e818927d5bf318b6f18896049b5d9afc28343
     layer 02: digest = sha256:412caad352a3ecbb29c080379407ae0761e7b9b454f7239cbfd1d1da25e06b29
     layer 03: digest = sha256:e6d3e61f7a504fa66d7275123969e9917570188650eb84b2280a726b996040f6
     layer 04: digest = sha256:461bb1d8c517c7f9fc0f1df66c9dc34c85a23421c1e1c540b2e28cbb258e75f5
     layer 05: digest = sha256:9297634c9537024497f76a2e1b374d8a315baa21d45bf36dc7980dc42ab93b0b
     layer 06: digest = sha256:c9cefb9872505d3a6fdcbbdbe4103393da3e384443c5a8cdd62bc368927ea1cc
     layer 07: digest = sha256:8560fc463426dc7e494720250efec25cdae1c4bf796c1a0172f791c0c7dde1c6

... skipping 8 manifest entries

[10]     Type: application/vnd.docker.distribution.manifest.v2+json
[10]   Digest: sha256:78af34429b7d75d61890746d39e27beb447970bad6803ed11ab4be920dbbd061
[10]   Length: 3401
[10] Platform:
[10]    -      OS: windows
[10]    - OS Vers: 10.0.17763.2565
[10]    -    Arch: amd64
[10] # Layers: 13
     layer 01: digest = sha256:4612f6d0b889cad0ed0292fae3a0b0c8a9e49aff6dea8eb049b2386d9b07986f
     layer 02: digest = sha256:1bd78008c728d8f9e56dc2093e6eb55f0f0b1aa96e5d0c7ccc830c5f60876cdf
     layer 03: digest = sha256:f0c1566a9285d9465334dc923e9d6fd93a51b3ef6cb8497efcacbcf64e3b93fc
     layer 04: digest = sha256:1b56caecef9c44ed58d2621ffb6f87f797b532c81f1271d9c339222462523eb2
     layer 05: digest = sha256:5a3ed0a076d58c949f5debdbc3616b6ccd008426c62635ab387836344123e2a6
     layer 06: digest = sha256:f25f9584c1aa90dae36704d6bef0e59e72002fcb13e8a4618f64c9b13479c0df
     layer 07: digest = sha256:12d4fbc7cf0f85fc63860f052f76bfb4429eca8b878abce79a25bfdc30f9e9f5
     layer 08: digest = sha256:c325dc9f1660ea537aae55b89be63d336762d5a3a02e929d52940586fb0f677e
     layer 09: digest = sha256:dd4f3aabaa2a9bf80e2a7f417dba559f6b34e640c21b138dce099328406c8903
     layer 10: digest = sha256:57e61367d26baed9e16a8d5310c520ae3429d5cc7956569f325cd9de01f33604
     layer 11: digest = sha256:98eb9abc560e8d857685b3b0131c733bdbb5f3c79e93fe7e9163e443736c2f51
     layer 12: digest = sha256:fffb0b96d90540c5fe04bec7c3803e767fc06c03da00c569b92ec1abeb2db503
     layer 13: digest = sha256:e6c16363a908ee64151cd232d466b723e3edac978f1c7693db3dcbed09694d76

While we can query non-manifest lists/indexes as well, this entry is clearly a manifest list (see the media type) with many platforms supported. To read how container engines like Docker use this information to determine what image/layers to pull read this early blog post on multi-platform support in Docker.

Create/Push

You can create manifest list or index entries in a registry by using the push command with either a YAML file describing the images to assemble or by using a series of command line parameters.

A sample YAML file is shown below. As long as the target registry supports the cross-repository push feature the source and target image names can differ as long as they are within the same registry host. For example, a source image could be named myprivreg:5000/someimage_arm64:latest and referenced by a manifest list in repository myprivreg:5000/someimage:latest.

Given a private registry running on port 5000, here is a sample YAML file input to manifest-tool to create a manifest list combining an 64-bit ARMv8 image and an amd64 image:

image: myprivreg:5000/someimage:latest
tags: ["1.0.0", "1.0", "1"]
manifests:
  -
    image: myprivreg:5000/someimage:arm64
    platform:
      architecture: arm64
      os: linux
  -
    image: myprivreg:5000/someimage:amd64
    platform:
      architecture: amd64
      os: linux

Note: Of course these component images must have been built and pushed to your target registry before running manifest-tool. The job of manifest-tool is simply to create the manifest which assembles existing images under a combined image reference pointing to a manifest list or OCI index.

Given this example YAML input you can push this manifest list as follows:

$ manifest-tool push from-spec someimage.yaml

manifest-tool can also use command line arguments with a templating model to specify the architecture/platform list and the from and to image formats as shown below:

$ manifest-tool push from-args \
    --platforms linux/amd64,linux/s390x,linux/arm64 \
    --template foo/bar-ARCH:v1 \
    --tags v1.0.0,v1.0 \
    --target foo/bar:v1

Specifically:

  • --platforms specifies which platforms you want to push for in the form OS/ARCH,OS/ARCH,...
  • --template specifies the image repo:tag source for inputs by replacing the placeholders OS, ARCH and VARIANT with the inputs from --platforms.
  • --tags specifies the tags to apply to the target image in addition to the --target tag.
  • --target specifies the target image repo:tag that will be the manifest list entry in the registry.

When using the optional VARIANT placeholder, it is ignored when a platform does not have a variant.

$ manifest-tool push from-args \
    --platforms linux/amd64,linux/arm/v5,linux/arm/v7 \
    --template foo/bar-ARCHVARIANT:v1 \
    --target foo/bar:v1

For the above example, linux/amd64 when applied to the template will look for an image named foo/bar-amd64:v1, while the platform entry linux/arm/v5 will resolve to an image reference: foo/bar-armv5:v1.

Known Supporting Registries

All major public cloud registries have added Docker v2.2 manifest list support over the years since the "fat manifest"-enabled specification came out in 2016.

Most registries also support the formalization of that via the "index" manifest type in the OCIv1 image format specification published in 2017.

If you find a registry provider for which manifest-tool does not work properly please open an issue in the GitHub issues for this project.

Test Index/Manifest List Support

If you operate or use a registry claiming conformance to Docker v2.2 spec and API or the OCIv1 image spec and distribution spec and want to confirm manifest list/index support please use the pre-configured test script available in this repository.

See the test-registry.sh script in this repo's integration directory for further details. A simple example is shown here:

$ ./test-registry.sh r.myprivreg.com/somerepo

History

This manifest-tool codebase was initially a joint project with Harshal Patil from IBM Bangalore, and originally forked from the registry client codebase, skopeo, created by Antonio Murdaca/runc0m, that later became a part of Project Atomic. Skopeo then became part of the overall Red Hat container client tooling later in its lifetime where it still resides today in the GitHub containers organization. The v2 rewrite of manifest-tool removed all the original vestiges of skopeo's original registry client and manifest parsing code, but is still part of the v1 releases of manifest-tool and codebase.

Thanks to both Antonio and Harshal for their initial work that made this possible! Also, thanks to Christy Perez from IBM Systems for her hard work in bringing the functionality of manifest-tool to the Docker client via a docker/cli PR. In early 2018 this PR formed the basis of a new docker manifest command which comprised most of the original code of manifest-tool and made multi-platform image creation available to users of the Docker client.

License

manifest-tool is licensed under the Apache Software License (ASL) 2.0

manifest-tool's People

Contributors

amouat avatar avian2 avatar boleynsu avatar deitch avatar dependabot[bot] avatar ekristen avatar estesp avatar friism avatar harche avatar ibuildthecloud avatar jnovack avatar jonjohnsonjr avatar jsoref avatar keg avatar luxas avatar makhov avatar mathewkoshy493 avatar neanton avatar pharshal avatar rn avatar runcom avatar starttoaster avatar tianon avatar tricktron avatar twz123 avatar vdemeester avatar yarikoptic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

manifest-tool's Issues

Manifest-Lists needs to have the same repo-name

I am exploring it in the context of having images for accelerators or optimized for a certain CPU and I would like to clarify how this works.

Say I have this YAML

image: qnib/ffmpeg:latest-rev8
manifests:
  -
    image: qnib/uplain-ffmpeg:latest-rev2
    platform:
      architecture: amd64
      os: linux
  -
    image: qnib/uplain-cuda-ffmpeg:9.2-rev2
    platform:
      architecture: amd64
      os: linux
      features:
        - cuda9.2
  -
    image: qnib/uplain-cuda-ffmpeg:10.0-rev2
    platform:
      architecture: amd64
      os: linux
      features:
        - cuda10.0

I do a push and it works fine. Looking at the spec I was afraid that the image had to have the same base name since the manifest list definition only specifies digests referencing to the same name.
https://docs.docker.com/registry/spec/manifest-v2-2/#example-manifest-list

But that does not matter, does it? When pushing to my private registry (DTR 2.6.0) I can see a new set of images are pushed to the resulting images (even though they are already there).

Question is: The manifest-tool is pulling and pushing the images in the process?

Provide better release filenames

First of all. Thank you for this tool!

Just noticed that usingmanifest-tool e.g. in a CI pipeline, one needs to provide the version several times.

script:
- apt-get update -qq && apt-get install -qq curl
- curl -s -L https://github.com/estesp/manifest-tool/releases/download/v2.0.0/binaries-manifest-tool-2.0.0.tar.gz -o binaries-manifest-tool.tar.gz
- tar xzf binaries-manifest-tool.tar.gz
- ./manifest-tool-linux-amd64 --username ...

Also it would be nice, if binaries could be provided directly to download

Best effort stack creation

Copied from harche/stackup#4

"Feature request:

I'm trying to hook this into our build process to support multiple architectures. At the moment it is a bit of a boot strapping nightmare to create the docker stackup/manifest because the manifest creation will fail if one of the build images is missing. I think it'd be better if a best effort manifest is created and the tool WARNS for missing architectures. This way the manifest creation can run as part of every architecture build and the last one run will update the 'partial' manifest with a full one."

multiple tags in a single yml file

In a single repo I want to setup multiple tags pointing to the same few base images. Something like this:

image: glennc/dotnet:1.1-runtime
manifests:
  -
    image: microsoft/dotnet:1.1.0-runtime
    platform:
      architecture: amd64
      os: linux
  -
    image: glennc/dotnet:1.1.0-runtime-nanoserver
    platform:
      architecture: amd64
      os: windows
image: glennc/dotnet:1.1-sdk
manifests:
  -
    image: glennc/dotnet:1.1.0-sdk-msbuild-rc4
    platform:
      architecture: amd64
      os: linux
  -
    image: glennc/dotnet:1.1.0-sdk-msbuild-rc4-nanoserver
    platform:
      architecture: amd64
      os: windows

Is there a YAML format I am missing that would make this possible? Seems like I would need many different files to make it work right now. If there is no good way to do it I could propose some formats we would accept and do a PR. Though my Go skills are weak so it might be a painful PR process to begin with :).

OS Variant info

As arm has (for example) v6 and v7 variants, it would be awesome to allow for 'if OS/ARCH/VARIANT use variant" else OS/ARCH

HTTP 401 when Mounting Blobs for cross-repository push

So I'm attempting to use manifest-tool 0.6.0 on macOS Sierra and I'm getting the following error every time I try to push to my repo troyfontaine/alpinelinux

YAML file:

image: troyfontaine/alpinelinux:latest
tags: [3.6,3]
manifests:
  - image: troyfontaine/x86_64-alpinelinux:3.6
    platform:
      architecture: amd64
      os: linux
  - image: troyfontaine/armhf-alpinelinux:3.6
    platform:
      architecture: arm
      os: linux

Error:

./manifest --debug --docker-cfg '/Users/troyfontaine/.docker/' push from-spec /Users/troyfontaine/repos/armhf-alpinelinux/alpine-multi.yaml
DEBU[0000] endpoints: [{false https://registry-1.docker.io v2 true true 0xc420294180}]
DEBU[0000] repoName: troyfontaine/alpinelinux
INFO[0000] Retrieving digests of images...
DEBU[0000] authConfig for docker.io:
DEBU[0000] endpoints: [{false https://registry-1.docker.io v2 true true 0xc420294300}]
DEBU[0000] Trying to fetch image manifest of troyfontaine/x86_64-alpinelinux repository from https://registry-1.docker.io v2
INFO[0004] Image "troyfontaine/x86_64-alpinelinux:3.6" is digest sha256:4099a07a7a96f96d6de32e2070a1f1c08f98864b1166031674796199bd61ade1; size: 946
DEBU[0004] Adding manifest references of "troyfontaine/x86_64-alpinelinux:3.6" to blob mount requests
DEBU[0004] Adding manifest "troyfontaine/x86_64-alpinelinux" -> to be pushed to "troyfontaine/alpinelinux" as a manifest reference
DEBU[0004] authConfig for docker.io:
DEBU[0004] endpoints: [{false https://registry-1.docker.io v2 true true 0xc420294480}]
DEBU[0004] Trying to fetch image manifest of troyfontaine/armhf-alpinelinux repository from https://registry-1.docker.io v2
INFO[0008] Image "troyfontaine/armhf-alpinelinux:3.6" is digest sha256:de2de4e9dcbb4458da037590674bfc6ef2adf8bcc8bf5994674033448694226e; size: 1781
DEBU[0008] Adding manifest references of "troyfontaine/armhf-alpinelinux:3.6" to blob mount requests
DEBU[0008] Adding manifest "troyfontaine/armhf-alpinelinux" -> to be pushed to "troyfontaine/alpinelinux" as a manifest reference
DEBU[0008] Manifest list push url: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/latest
DEBU[0008] mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json
DEBU[0008] authConfig for docker.io:
FATA[0010] Couldn't mount blobs for cross-repository push: Blob mount failed to url https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/uploads/?from=troyfontaine%2Fx86_64-alpinelinux&mount=sha256%3A16db5cadd91195907cf705314c2b48a00ce6a2fe67c9bd858142f8120df95f55: HTTP status 401

Using the exact same YAML file, on my Raspberry Pi 3 with the ARM version of the manifest tool, I don't receive the 401 error and instead it looks like it successfully pushes the two images as one to Dockerhub-however the resultant image when checked via the Hub web interface only contains the x86_64 image and no ARM image (even though it shows the ARM image in the manifest). An additional test with only the ARM image in the manifest file tagged as experiment does upload the ARM image-a follow up test seems to indicate only one of the two images is ever actually placed in the repository-whichever one is first in the list of images.

Raspberry Pi Output:

DEBU[0000] endpoints: [{false https://registry-1.docker.io v2 true true 0x1096a620}]
DEBU[0000] repoName: troyfontaine/alpinelinux
INFO[0000] Retrieving digests of images...
DEBU[0000] authConfig for docker.io: troyfontaine
DEBU[0000] endpoints: [{false https://registry-1.docker.io v2 true true 0x1096a700}]
DEBU[0000] Trying to fetch image manifest of troyfontaine/x86_64-alpinelinux repository from https://registry-1.docker.io v2
INFO[0002] Image "troyfontaine/x86_64-alpinelinux:3.6" is digest sha256:4099a07a7a96f96d6de32e2070a1f1c08f98864b1166031674796199bd61ade1; size: 946
DEBU[0002] Adding manifest references of "troyfontaine/x86_64-alpinelinux:3.6" to blob mount requests
DEBU[0002] Adding manifest "troyfontaine/x86_64-alpinelinux" -> to be pushed to "troyfontaine/alpinelinux" as a manifest reference
DEBU[0002] authConfig for docker.io: troyfontaine
DEBU[0002] endpoints: [{false https://registry-1.docker.io v2 true true 0x10d88540}]
DEBU[0002] Trying to fetch image manifest of troyfontaine/armhf-alpinelinux repository from https://registry-1.docker.io v2
INFO[0004] Image "troyfontaine/armhf-alpinelinux:3.6" is digest sha256:de2de4e9dcbb4458da037590674bfc6ef2adf8bcc8bf5994674033448694226e; size: 1781
DEBU[0004] Adding manifest references of "troyfontaine/armhf-alpinelinux:3.6" to blob mount requests
DEBU[0004] Adding manifest "troyfontaine/armhf-alpinelinux" -> to be pushed to "troyfontaine/alpinelinux" as a manifest reference
DEBU[0004] Manifest list push url: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/latest
DEBU[0004] mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json
DEBU[0004] authConfig for docker.io: troyfontaine
DEBU[0006] Mount of blob sha256:16db5cadd91195907cf705314c2b48a00ce6a2fe67c9bd858142f8120df95f55 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:16db5cadd91195907cf705314c2b48a00ce6a2fe67c9bd858142f8120df95f55"
DEBU[0006] Mount of blob sha256:106b6ac7b806d53cb6ca167fc71cf843332239f011c31b31f51a9a7a7c602263 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:106b6ac7b806d53cb6ca167fc71cf843332239f011c31b31f51a9a7a7c602263"
DEBU[0007] Mount of blob sha256:2ea238f6593bb09ebbb0512bdb48f40e429d076a73ba90994fe8e0573f09279f succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:2ea238f6593bb09ebbb0512bdb48f40e429d076a73ba90994fe8e0573f09279f"
DEBU[0009] Mount of blob sha256:4566c141f3d8aced657f23e14314aca29bed58b33e32bc00adb1931e69913831 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:4566c141f3d8aced657f23e14314aca29bed58b33e32bc00adb1931e69913831"
DEBU[0010] Mount of blob sha256:46da144a2557aa78519a263334f722d5f71978ddc3287b59ca178d35dd9b19fb succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:46da144a2557aa78519a263334f722d5f71978ddc3287b59ca178d35dd9b19fb"
DEBU[0010] Mount of blob sha256:af176764c2b066e6e141e938cf846470c96abca19a183456c12f361132eb4cd1 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:af176764c2b066e6e141e938cf846470c96abca19a183456c12f361132eb4cd1"
DEBU[0011] Mount of blob sha256:4f154478f908cd2a126caf300df54e1c6af06a20ae175093e37289d7cb7cea7c succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:4f154478f908cd2a126caf300df54e1c6af06a20ae175093e37289d7cb7cea7c"
DEBU[0012] Mount of blob sha256:8c087316ec95dacdf635b9afc59c6184a6e6f285370bdc1c23abb60ddfe70152 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:8c087316ec95dacdf635b9afc59c6184a6e6f285370bdc1c23abb60ddfe70152"
DEBU[0013] Mount of blob sha256:08f7af38495581ff00fd32bf9c6372b399b42ac91fb5c4cb995ed4925df47e4f succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:08f7af38495581ff00fd32bf9c6372b399b42ac91fb5c4cb995ed4925df47e4f"
DEBU[0014] Mount of blob sha256:e280258d0eacb54d7c24c7ce45f6b9f60fb2d6a9f8e5192ae6b6cd85c1170716 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:e280258d0eacb54d7c24c7ce45f6b9f60fb2d6a9f8e5192ae6b6cd85c1170716"
DEBU[0015] Mount of blob sha256:793ddac0f4549ec4118eb87e652ec9ad9ae8733b595baef7a2fa49f2c21d4db6 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:793ddac0f4549ec4118eb87e652ec9ad9ae8733b595baef7a2fa49f2c21d4db6"
DEBU[0016] Mount of blob sha256:656ad3fd4ea4a28bfdfacbd5cffe2ae6b965271f66a9dfee6a412634f643ab42 succeeded, location: "https://registry-1.docker.io/v2/troyfontaine/alpinelinux/blobs/sha256:656ad3fd4ea4a28bfdfacbd5cffe2ae6b965271f66a9dfee6a412634f643ab42"
DEBU[0016] manifest reference push URL: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/sha256:4099a07a7a96f96d6de32e2070a1f1c08f98864b1166031674796199bd61ade1
DEBU[0016] referenced manifest "troyfontaine/x86_64-alpinelinux" pushed; digest matches: sha256:4099a07a7a96f96d6de32e2070a1f1c08f98864b1166031674796199bd61ade1
DEBU[0016] manifest reference push URL: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/sha256:de2de4e9dcbb4458da037590674bfc6ef2adf8bcc8bf5994674033448694226e
DEBU[0017] referenced manifest "troyfontaine/armhf-alpinelinux" pushed; digest matches: sha256:de2de4e9dcbb4458da037590674bfc6ef2adf8bcc8bf5994674033448694226e
DEBU[0017] [extra tag "3.6"] push url: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/3.6
DEBU[0018] [extra tag "3"] push url: https://registry-1.docker.io/v2/troyfontaine/alpinelinux/manifests/3
Digest: sha256:9cea7307a83ac181bec9a3a1164f9673b833c2989a5f1591c893fa0fd2b63d78

Manifest Inspect Output:

./manifest inspect troyfontaine/alpinelinux:latest
Name:   troyfontaine/alpinelinux:latest (Type: application/vnd.docker.distribution.manifest.list.v2+json)
Digest: sha256:9cea7307a83ac181bec9a3a1164f9673b833c2989a5f1591c893fa0fd2b63d78
 * Contains 2 manifest references:
1    Mfst Type: application/vnd.docker.distribution.manifest.v2+json
1       Digest: sha256:4099a07a7a96f96d6de32e2070a1f1c08f98864b1166031674796199bd61ade1
1  Mfst Length: 946
1     Platform:
1           -      OS: linux
1           - OS Vers:
1           - OS Feat: []
1           -    Arch: amd64
1           - Variant:
1           - Feature:
1     # Layers: 3
         layer 1: digest = sha256:106b6ac7b806d53cb6ca167fc71cf843332239f011c31b31f51a9a7a7c602263
         layer 2: digest = sha256:2ea238f6593bb09ebbb0512bdb48f40e429d076a73ba90994fe8e0573f09279f
         layer 3: digest = sha256:4566c141f3d8aced657f23e14314aca29bed58b33e32bc00adb1931e69913831

2    Mfst Type: application/vnd.docker.distribution.manifest.v2+json
2       Digest: sha256:de2de4e9dcbb4458da037590674bfc6ef2adf8bcc8bf5994674033448694226e
2  Mfst Length: 1781
2     Platform:
2           -      OS: linux
2           - OS Vers:
2           - OS Feat: []
2           -    Arch: arm
2           - Variant:
2           - Feature:
2     # Layers: 7
         layer 1: digest = sha256:af176764c2b066e6e141e938cf846470c96abca19a183456c12f361132eb4cd1
         layer 2: digest = sha256:4f154478f908cd2a126caf300df54e1c6af06a20ae175093e37289d7cb7cea7c
         layer 3: digest = sha256:8c087316ec95dacdf635b9afc59c6184a6e6f285370bdc1c23abb60ddfe70152
         layer 4: digest = sha256:08f7af38495581ff00fd32bf9c6372b399b42ac91fb5c4cb995ed4925df47e4f
         layer 5: digest = sha256:e280258d0eacb54d7c24c7ce45f6b9f60fb2d6a9f8e5192ae6b6cd85c1170716
         layer 6: digest = sha256:793ddac0f4549ec4118eb87e652ec9ad9ae8733b595baef7a2fa49f2c21d4db6
         layer 7: digest = sha256:656ad3fd4ea4a28bfdfacbd5cffe2ae6b965271f66a9dfee6a412634f643ab42

Even with only the x86_64 image in the manifest tool on my Mac, it still gives the 401 error.

In either case, when I try to simply run the resultant image on the Raspberry Pi I receive an exec format error-which I don't receive when I use the original ARM source image I made-so something seems to be off in Docker picking the correct image to use?

Am I doing something wrong or am I actually encountering errors?

Please provide release binaries for linux-arm64

@estesp It would be great if we'd have binaries for linux/arm64 created at release time, I guess you just have to include this new arch into your cross-compile build script. 😏

There are some cool aarch64 servers out there which didn't have the possibility to run arm 32bit code, I'm thinking about the Cavium ThunderX powered packet.net 2A servers I'm working with.

Modules not working (canonical imports wrong?)

thockin-glaptop4 go-build-template 6d246 master /tools$ go get -d github.com/estesp/manifest-tool
go get: github.com/codegangsta/[email protected]: parsing go.mod:
	module declares its path as: github.com/urfave/cli
	        but was required as: github.com/codegangsta/cli

thockin-glaptop4 go-build-template 6d246 master /tools$ go get -d github.com/estesp/[email protected]
go get: github.com/codegangsta/[email protected]: parsing go.mod:
	module declares its path as: github.com/urfave/cli
	        but was required as: github.com/codegangsta/cli

Latest code throws an error while inspecting registry.access.redhat.com/ubi8/ubi image

Error:

$ ./manifest-tool inspect registry.access.redhat.com/ubi8/ubi
ERRO[0000] object required
ERRO[0000] Unknown descriptor type:

and docker manifest does work properly and prints:

$ docker manifest inspect registry.access.redhat.com/ubi8/ubi
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 737,
         "digest": "sha256:8ee9d7bbcfc19d383f9044316a5c5fbcbe2df6be3c97f6c7a5422527b29bdede",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 737,
         "digest": "sha256:de0185f0fed3bc78c2055a3753a9aa2c8c77de3a8bf5a7d621b11c396cf417fa",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 737,
         "digest": "sha256:03ef40d7edca9e5ac4900493ace629be45be8258ccdbbdd1c14bf147025faa71",
         "platform": {
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 737,
         "digest": "sha256:737eafb6d1bd51655b661ac25f1e048c02f722cf00d2942150c1ca77a44f0b64",
         "platform": {
            "architecture": "s390x",
            "os": "linux"
         }
      }
   ]
}

manifest-tool 1.0.0 fails to run on s390x (sometimes?)

Here's the backtrace:

$ manifest-tool push from-spec ...
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]

goroutine 97 [running]:
runtime: unexpected return pc for runtime.sigpanic called from 0x0
stack: frame={sp:0xc0001271b0, fp:0xc0001271d8} stack=[0xc000124000,0xc000128000)
000000c0001270b0:  000000c000240930  000000000070eaa0 
000000c0001270c0:  0000000000adc790  010000c000127110 
000000c0001270d0:  0000000000000000  00000000000457d0 <runtime.fatalpanic+80> 
000000c0001270e0:  0000000000045196 <runtime.gopanic+806>  000000c0001270f8 
000000c0001270f0:  0000000000044b60 <runtime.preprintpanics+64>  0000000000073c00 <runtime.fatalpanic.func1+0> 
000000c000127100:  000000c000127188  000000c0002b0780 
000000c000127110:  0000000000045196 <runtime.gopanic+806>  000000c000127128 
000000c000127120:  000000c0001270f0  000000000005d94a <runtime.sigpanic+1098> 
000000c000127130:  000000c000127188  000000000066c0d0 
000000c000127140:  000000c000127f50  0000000800000008 
000000c000127150:  000000000027d0ae <crypto/tls.(*Conn).Handshake+142>  0000000000000000 
000000c000127160:  000000c000127ec0  000000c0002b0780 
000000c000127170:  0000000000000000  000000c000127f20 
000000c000127180:  000000c0002b07a8  0000000000000000 
000000c000127190:  000000000056aaa0  000000c000240930 
000000c0001271a0:  0000000000000000  0000000000000000 
000000c0001271b0: <0000000000000000  000000000059ea20 
000000c0001271c0:  0000000000adc790  0000000000000000 
000000c0001271d0:  0000000000000000 >0000000000000000 
000000c0001271e0:  0000000000000000  0000000000000000 
000000c0001271f0:  0000000000000000  0000000000000000 
000000c000127200:  0000000000000000  0000000000000000 
000000c000127210:  0000000000000000  0100000000000000 
000000c000127220:  0000000000000000  0000000000000000 
000000c000127230:  0000000000000000  0000000000000000 
000000c000127240:  0000000000000000  0000000000000000 
000000c000127250:  0000000000000000  0000000000000000 
000000c000127260:  0000000000000000  0000000000000000 
000000c000127270:  0000000000000000  0000000000000000 
000000c000127280:  0000000000000000  0000000000000000 
000000c000127290:  0000000000000000  0000000000000000 
000000c0001272a0:  0000000000000000  0000000000000000 
000000c0001272b0:  0000000000000000  0000000000000000 
000000c0001272c0:  0000000000000000  0000000000000000 
000000c0001272d0:  0000000000000000 
panic(0x59ea20, 0xadc790)
	/usr/local/go/src/runtime/panic.go:722 +0x326
runtime: unexpected return pc for runtime.sigpanic called from 0x0
stack: frame={sp:0xc0001271b0, fp:0xc0001271d8} stack=[0xc000124000,0xc000128000)
000000c0001270b0:  000000c000240930  000000000070eaa0 
000000c0001270c0:  0000000000adc790  010000c000127110 
000000c0001270d0:  0000000000000000  00000000000457d0 <runtime.fatalpanic+80> 
000000c0001270e0:  0000000000045196 <runtime.gopanic+806>  000000c0001270f8 
000000c0001270f0:  0000000000044b60 <runtime.preprintpanics+64>  0000000000073c00 <runtime.fatalpanic.func1+0> 
000000c000127100:  000000c000127188  000000c0002b0780 
000000c000127110:  0000000000045196 <runtime.gopanic+806>  000000c000127128 
000000c000127120:  000000c0001270f0  000000000005d94a <runtime.sigpanic+1098> 
000000c000127130:  000000c000127188  000000000066c0d0 
000000c000127140:  000000c000127f50  0000000800000008 
000000c000127150:  000000000027d0ae <crypto/tls.(*Conn).Handshake+142>  0000000000000000 
000000c000127160:  000000c000127ec0  000000c0002b0780 
000000c000127170:  0000000000000000  000000c000127f20 
000000c000127180:  000000c0002b07a8  0000000000000000 
000000c000127190:  000000000056aaa0  000000c000240930 
000000c0001271a0:  0000000000000000  0000000000000000 
000000c0001271b0: <0000000000000000  000000000059ea20 
000000c0001271c0:  0000000000adc790  0000000000000000 
000000c0001271d0:  0000000000000000 >0000000000000000 
000000c0001271e0:  0000000000000000  0000000000000000 
000000c0001271f0:  0000000000000000  0000000000000000 
000000c000127200:  0000000000000000  0000000000000000 
000000c000127210:  0000000000000000  0100000000000000 
000000c000127220:  0000000000000000  0000000000000000 
000000c000127230:  0000000000000000  0000000000000000 
000000c000127240:  0000000000000000  0000000000000000 
000000c000127250:  0000000000000000  0000000000000000 
000000c000127260:  0000000000000000  0000000000000000 
000000c000127270:  0000000000000000  0000000000000000 
000000c000127280:  0000000000000000  0000000000000000 
000000c000127290:  0000000000000000  0000000000000000 
000000c0001272a0:  0000000000000000  0000000000000000 
000000c0001272b0:  0000000000000000  0000000000000000 
000000c0001272c0:  0000000000000000  0000000000000000 
000000c0001272d0:  0000000000000000 
runtime.panicmem(...)
	/usr/local/go/src/runtime/panic.go:199
runtime.sigpanic()
	/usr/local/go/src/runtime/signal_unix.go:394 +0x44a
created by net/http.(*persistConn).addTLS
	/usr/local/go/src/net/http/transport.go:1397 +0x1b4

I'm not 100% sure the exact cause, but 1.0.0 was built against Go 1.13(.0), and testing a build against Go 1.13.8 was successful. Looking through golang/go@go1.13...go1.13.8, my best guess is golang/go@4cb22ee (crypto related s390x fix that talks about a panic), but I haven't done a full bisect of Go to confirm the exact commit. 😇

Any chance we could get a 1.0.1 or something that's built against a newer Go 1.13 release? 😄

(See docker-library/golang#321 for a downstream effect of this. Our alternative is going to be to build our own manifest-tool binaries, so we figured it was worth asking you to do that instead! 🥇 ❤️)

what does option os feature mean?

I am not sure if this tool can differentiate os distro, like ubuntu and redhat.
Then I got the os feature--os-features stringSlice Set operating system feature, just ask this.

Is that possible to differentiate the two distro?

The allowed os/arch combinations are too restrictive

I stumbled across this hardcoded list in manifest-tool while reviewing something unrelated:

// list of valid os/arch values (see "Optional Environment Variables" section
// of https://golang.org/doc/install/source
var validOSArch = map[string]bool{
"darwin/386": true,
"darwin/amd64": true,
"darwin/arm": true,
"darwin/arm64": true,
"dragonfly/amd64": true,
"freebsd/386": true,
"freebsd/amd64": true,
"freebsd/arm": true,
"linux/386": true,
"linux/amd64": true,
"linux/arm": true,
"linux/arm/v5": true,
"linux/arm/v6": true,
"linux/arm/v7": true,
"linux/arm64": true,
"linux/arm64/v8": true,
"linux/ppc64": true,
"linux/ppc64le": true,
"linux/mips64": true,
"linux/mips64le": true,
"linux/s390x": true,
"netbsd/386": true,
"netbsd/amd64": true,
"netbsd/arm": true,
"openbsd/386": true,
"openbsd/amd64": true,
"openbsd/arm": true,
"plan9/386": true,
"plan9/amd64": true,
"solaris/amd64": true,
"windows/386": true,
"windows/amd64": true,
"windows/arm": true,
}

Per the spec, os and architecture values come from GOOS/GOARCH, while the variant field is hardcoded.

From what I understand, it doesn't make sense to validate the combinations like this (other than for arm + variant). This list of valid combinations are specific to the go compiler and completely unrelated to the image spec. As is, manifest-tool is only capable of pushing images for platforms for which the golang compiler has an implementation. I think (if you're going to be doing this validation at all) you should just be checking that:

  1. architecture is a valid GOARCH, and
  2. os is a valid GOOS, and
  3. variant is valid per the spec:
    1. v6 == arm
    2. v7 == arm
    3. v8 == arm|arm64

[Feature Request]: from-args should support docker manifest like syntax

First of all, Thanks for the tool!!

I am trying to use this to create/push a manifest from inside the docker container (can't use docker). I want to avoid writing a temporary file to pass in from-spec.

so, for the from-args, would it be possible to add multiple args (similar to docker manifest) to add images to the manifest. Currently the --template only takes the name of the image, for example, gcr.io/imagename-ARCH, but it wouldn't work if the image names don't conform to a common format.

for example, I build arm64 and amd64 builds separately, and so the tag's are actually different:

arm64: gcr.io/image-name-arm64:14
amd64: gcr.io/image-name-amd64:15 

so, in this case, you can't use the --template args and have to use from-spec to specify the full name for each arch type.
docker manifest command:

docker manifest create gcr.io/image-name:1-multi --amend gcr.io/image-name:1-arm64 --amend gcr.io/image-name/:1-amd64

would be nice to have something like:

./manifest-tool push --from-args --image-name gcr.io/image-name:1-multi  --amend gcr.io/image-name:1-arm64 --amend gcr.io/image-name/:1-amd64

Please let me know if there's another way to do this from the command line.

Mount blobs for cross-repository push fails with error 401

I am using the test-registry.sh script against GitLab's built in docker registry and receive the following error:

FATA[0001] Couldn't mount blobs for cross-repository push: Blob mount failed to url https://docker-registry.example.com/v2/docker/alpine/alpine/blobs/uploads/?from=docker%2Falpine%2Fppc64le_alpine&mount=sha256%3Adaa414b19dcffa0ba7b80abb50a6b31156f1efd7bb1b8cdaeeb848da367afa38: HTTP status 401

Looking at the registry logs on the GitLab server, I see the following output:

2017-11-14_03:28:44.61975 127.0.0.1 - - [14/Nov/2017:03:28:44 +0000] "GET /v2/docker/alpine/aarch64_alpine/tags/list HTTP/1.0" 200 58 "" "docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm"
2017-11-14_03:28:44.66553 time="2017-11-14T03:28:44.66546939Z" level=info msg="response completed" environment=production go.version=go1.8.1 http.request.host=docker-registry.doneproperly.xyz http.request.id=6a1214c7-567f-42dd-8893-6899eedcab47 http.request.method=GET http.request.remoteaddr=192.168.10.101 http.request.uri="/v2/docker/alpine/aarch64_alpine/blobs/sha256:8e8812ba3b2d44c581d76fa0ad56a60e346c10cb1a778b10089d3d385502e0a4" http.request.useragent="docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm" http.response.contenttype="application/octet-stream" http.response.duration=3.660519ms http.response.status=200 http.response.written=1471 instance.id=4209bdd6-ac20-415d-86ae-f9a51333900d service=registry version=v2.6.1-1-gdd544a8
2017-11-14_03:28:44.66555 127.0.0.1 - - [14/Nov/2017:03:28:44 +0000] "GET /v2/docker/alpine/aarch64_alpine/blobs/sha256:8e8812ba3b2d44c581d76fa0ad56a60e346c10cb1a778b10089d3d385502e0a4 HTTP/1.0" 200 1471 "" "docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm"
2017-11-14_03:28:44.71927 time="2017-11-14T03:28:44.719224984Z" level=warning msg="error authorizing context: authorization token required" environment=production go.version=go1.8.1 http.request.host=docker-registry.doneproperly.xyz http.request.id=2c9c4925-cd41-4beb-bd8e-324e48f4b200 http.request.method=GET http.request.remoteaddr=192.168.10.101 http.request.uri="/v2/" http.request.useragent="docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm" instance.id=4209bdd6-ac20-415d-86ae-f9a51333900d service=registry version=v2.6.1-1-gdd544a8
2017-11-14_03:28:44.71929 127.0.0.1 - - [14/Nov/2017:03:28:44 +0000] "GET /v2/ HTTP/1.0" 401 87 "" "docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm"
2017-11-14_03:28:44.89450 time="2017-11-14T03:28:44.894352846Z" level=warning msg="error authorizing context: insufficient scope" environment=production go.version=go1.8.1 http.request.host=docker-registry.doneproperly.xyz http.request.id=89626d73-237b-474e-8fa9-65420e28de23 http.request.method=POST http.request.remoteaddr=192.168.10.101 http.request.uri="/v2/docker/alpine/alpine/blobs/uploads/?from=docker%2Falpine%2Fppc64le_alpine&mount=sha256%3Adaa414b19dcffa0ba7b80abb50a6b31156f1efd7bb1b8cdaeeb848da367afa38" http.request.useragent="docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm" instance.id=4209bdd6-ac20-415d-86ae-f9a51333900d service=registry vars.name="docker/alpine/alpine" version=v2.6.1-1-gdd544a8
2017-11-14_03:28:44.89459 127.0.0.1 - - [14/Nov/2017:03:28:44 +0000] "POST /v2/docker/alpine/alpine/blobs/uploads/?from=docker%2Falpine%2Fppc64le_alpine&mount=sha256%3Adaa414b19dcffa0ba7b80abb50a6b31156f1efd7bb1b8cdaeeb848da367afa38 HTTP/1.0" 401 329 "" "docker/library-import go/go1.9.1 git-commit/library-import kernel/4.9.41-v7+ os/linux arch/arm"

Listing the tags works without issue, however the next steps are not authorised.

Can't push to different repository

The readme says

Cross-repository push is exploited in manifest-tool so the source and target image names can differ as long as they are within the same registry

But I was having problems with it. I tested this on Docker Trusted Registry, but I bet you'll see the same behavior with the open source registry.

Example yaml

Here I'm fetching from the admin/hello-world repo and pushing to the admin/multi repo

image: 192.168.99.100:444/admin/multi:latest
manifests:
  -
    image: 192.168.99.100:444/admin/hello-world:linux
    platform:
      architecture: amd64
      os: linux
  -
    image: 192.168.99.100:444/admin/hello-world:windows
    platform:
      architecture: amd64
      os: windows

Logs

docker@node-1:~/estesp/manifest-tool$ ./manifest-tool --debug --username admin --password password  push from-spec helloworld.yaml


DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc42006f1e0} {false http://192.168.99.100:444 v2 false true 0xc42006f1e0} {false https://192.168.99.100:444 v1 false true 0xc42006f340} {false http://192.168.99.100:444 v1 false true 0xc42006f340}]
DEBU[0000] repoName: admin/hello-world
INFO[0000] Retrieving digests of images...
DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc42006f600} {false http://192.168.99.100:444 v2 false true 0xc42006f600}]
DEBU[0000] Trying to fetch image manifest of 192.168.99.100:444/admin/hello-world repository from https://192.168.99.100:444 v2
INFO[0000] Image "192.168.99.100:444/admin/hello-world:linux" is digest sha256:9fa82f24cbb11b6b80d5c88e0e10c3306707d97ff862a3018f22f9b49cef303a; size: 524
DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc4204209a0} {false http://192.168.99.100:444 v2 false true 0xc4204209a0}]
DEBU[0000] Trying to fetch image manifest of 192.168.99.100:444/admin/hello-world repository from https://192.168.99.100:444 v2
INFO[0000] Image "192.168.99.100:444/admin/hello-world:windows" is digest sha256:5bc99306d25a8301b5bc5bf411f7fd45c2b96a738467b86bbbbd493fafa59e74; size: 1157
DEBU[0000] Manifest list push url: https://192.168.99.100:444/v2/admin/hello-world/manifests/mix
DEBU[0000] mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:4dee369ee73a60b45fd33aa9f81b0d1bfa20974a475f5848c3095abcc7b2a129
docker@node-1:~/estesp/manifest-tool$ vi helloworld.yaml
docker@node-1:~/estesp/manifest-tool$ ./manifest-tool --debug --username admin --password password  push from-spec helloworld.yaml
DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc42006f1e0} {false http://192.168.99.100:444 v2 false true 0xc42006f1e0} {false https://192.168.99.100:444 v1 false true 0xc42006f340} {false http://192.168.99.100:444 v1 false true 0xc42006f340}]
DEBU[0000] repoName: admin/multi
INFO[0000] Retrieving digests of images...
DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc42006f600} {false http://192.168.99.100:444 v2 false true 0xc42006f600}]
DEBU[0000] Trying to fetch image manifest of 192.168.99.100:444/admin/hello-world repository from https://192.168.99.100:444 v2
INFO[0000] Image "192.168.99.100:444/admin/hello-world:linux" is digest sha256:9fa82f24cbb11b6b80d5c88e0e10c3306707d97ff862a3018f22f9b49cef303a; size: 524
DEBU[0000] Adding manifest references of "192.168.99.100:444/admin/hello-world:linux" to blob mount requests
DEBU[0000] Adding manifest "admin/hello-world" -> to be pushed to "admin/multi" as a manifest reference
DEBU[0000] endpoints: [{false https://192.168.99.100:444 v2 false true 0xc42041c9a0} {false http://192.168.99.100:444 v2 false true 0xc42041c9a0}]
DEBU[0000] Trying to fetch image manifest of 192.168.99.100:444/admin/hello-world repository from https://192.168.99.100:444 v2
INFO[0000] Image "192.168.99.100:444/admin/hello-world:windows" is digest sha256:5bc99306d25a8301b5bc5bf411f7fd45c2b96a738467b86bbbbd493fafa59e74; size: 1157
DEBU[0000] Adding manifest references of "192.168.99.100:444/admin/hello-world:windows" to blob mount requests
DEBU[0000] Adding manifest "admin/hello-world" -> to be pushed to "admin/multi" as a manifest reference
DEBU[0000] Manifest list push url: https://192.168.99.100:444/v2/admin/multi/manifests/mix
DEBU[0000] mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json
DEBU[0000] Mount of blob sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57 succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
DEBU[0000] Mount of blob sha256:75a9eeebd1942155f07f01666ccb4cc03afc6ef49c5b18a6ecd5777b89c52842 succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:75a9eeebd1942155f07f01666ccb4cc03afc6ef49c5b18a6ecd5777b89c52842"
DEBU[0000] Mount of blob sha256:aa8467f01b47cc23e5553f939176241d83894f12760dc62163a9167ea29bed4d succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:aa8467f01b47cc23e5553f939176241d83894f12760dc62163a9167ea29bed4d"
DEBU[0001] Mount of blob sha256:35aba4b22d486db55a401eebdef3ffa69d00539497b83d9f4b62e3582cb4ced7 succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:35aba4b22d486db55a401eebdef3ffa69d00539497b83d9f4b62e3582cb4ced7"
DEBU[0001] Mount of blob sha256:e8373113288ca2edea9ee90425d231f76a2a4a5ab76efa4f999718d6ce7c296f succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:e8373113288ca2edea9ee90425d231f76a2a4a5ab76efa4f999718d6ce7c296f"
DEBU[0001] Mount of blob sha256:8cac44e17f163c3d91ed53f581567737c54e14356bfddfe2335118af67647055 succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:8cac44e17f163c3d91ed53f581567737c54e14356bfddfe2335118af67647055"
DEBU[0001] Mount of blob sha256:5e160e4d8db328496619b49dde96716f1fe35baa7eebe3798b41130309de8105 succeeded, location: "https://192.168.99.100:444/v2/admin/multi/blobs/sha256:5e160e4d8db328496619b49dde96716f1fe35baa7eebe3798b41130309de8105"
DEBU[0001] manifest reference push URL: https://192.168.99.100:444/v2/192.168.99.100:444/admin/multi/manifests/sha256:9fa82f24cbb11b6b80d5c88e0e10c3306707d97ff862a3018f22f9b49cef303a


FATA[0001] Couldn't push manifests referenced in our manifest list: Referenced manifest push unsuccessful: response 401: 401 Unauthorized

Note that the in the penultimate line it seems that the push url is wrong, since it includes twice the domain and port of my registry.

Use manifest-tool/docker manifest to "retag" manifests for staging?

In our pipeline we use different tags for stages like unstable, testing, stable, ...
At the moment to retag an image we have to pull it completely, tag it and push the tag (which will be cached as no layer has differences). This is done on a separate machine that normally has no images pulled, so we don't want that pull as it takes time.
And thinking of multiarch/multios images for Windows and Linux this wouldn't be possible on a Linux machine as it can't pull and push Windows images.

So I tried the manifest-tool yesterday (with only linux/amd64 right now, so only one platform) to use it to remote "tag" an image. For the first step using real images as input it works, but for the next stage it only shows an error

$ manifest-tool push from-args --platforms linux/amd64 --template "org/app:testing" --target "org/app:production"
INFO[0000] Retrieving digests of images...              
FATA[0003] You specified a manifest list entry from a digest that points to a current manifest list. Manifest lists do not allow recursion. 

I then tried the "docker manifest" pull request, and it worked for that step as well. But soon I found out that it probably only worked because the manifest list only has one platform listed. I tried it with a multiarch image and the "docker manifest" command also comes up with the same error.

My workflow in mind would look like this:

docker_manifest

Any ideas how to support that with manifest-tool or "docker manifest" command?
Especially moving/retagging multiarch images would be interesting without pulling all images.

incorrect manifest reference push URL

Hello,

I am having trouble pushing my manifest list to my private registry.
Let's say my server was https://docker.test.com/v1/

I am getting the following error. The debug output shows that the reference push URL is appended twice (docker.test.com after docker.test.com).

DEBU[0005] manifest reference push URL: https://docker.test.com/v1/docker.test.com/v1/repo-name/manifests/shaxxx:xxxxxxxxx
FATA[0005] Couldn't push manifests referenced in our manifest list: Referenced manifest push unsuccessful: response 400: 400 Bad Request 

This is the command I use to run this:
./manifest-tool --debug --docker-cfg '/home/user/.docker/' push from-spec <path-to-yaml>

My config.json file looks like this:

{
	"auths": {
		"docker.test.com": {
			"auth": "xxxxxxxxxxxxxx"
		}
	}
}

this is what my yaml file looks like

image: docker.test.com/v1/repo-name:6
manifests:
  -
    image: docker.test.com/v1/repo-name-arm:1.0
    platform:
      architecture: arm
      os: linux
  -
    image: docker.test.com/v1/repo-name-x86/1.0:latest
    platform:
      architecture: amd64
      os: linux

Please let me know how I can resolve this. Thanks.

Integration Test Failure

When running the integration tests, I get:

Manifest entry for image trow.test:8443/test/aarch64_alpine:latest has unsupported os/arch or os/arch/variant combination: linux/arm64/armv8

This seems to be caused by this line in docker/util.go https://github.com/estesp/manifest-tool/blob/master/docker/util.go#L25

"linux/arm64/v8":  true,

(Note armv8 vs v8).

Changing this line in the code makes the tests pass for the Trow registry (on master). I'm not sure if that's the correct fix or if something else is wrong.

Add usage example

There is sort of half an example, but it doesn't work as it's missing the pushml command.

You could also paste the output of manifest --help.

Merry Xmas 🎄 :)

v2.0.x containerd docker remote bug: sometimes gets "cannot reuse body, request must be retried"

manifest-tool                                         \
    --username=oauth2accesstoken                      \
    --password=$(gcloud auth print-access-token)     \
    push from-args                                    \
    --platforms "$platforms"                         \
    --template gcr.io/k8s-staging-git-sync/git-sync:v3.3.3__OS_ARCH \
    --target gcr.io/k8s-staging-git-sync/git-sync:v3.3.3
FATA[0004] Error pushing manifest list/index to registry: sha256:343fd4cd9582fc02b98d6641aa29356d5986ab1a31de5c5b1d0080815e083cbe: failed commit on ref "manifest-sha256:fcb67f390ed38b64a54c7c26bb72c3494d6c269c7389add0448d0dde8b510d58": cannot reuse body, request must be retried 

Syncing to v1.0.3 works, but since this doesn't use go modules, that's a PITA :)

ECR Public?

Has anyone successfully used manifest-tool against ECR Public? I'm trying both 1.0 and 2.0 and coming up short, and hoping maybe there's something I'm doing wrong, but both versions are failing in different ways with the same YAML.

Here's an example YAML, for reference (if you have an ECR Public repository, you should be able to swap this first image: and test for yourself 😇):

image: public.ecr.aws/debian/debian:bullseye
tags:
  - bullseye-20210621
manifests:
  - image: public.ecr.aws/debian/amd64:bullseye
  - image: public.ecr.aws/debian/armel:bullseye
  - image: public.ecr.aws/debian/armhf:bullseye
  - image: public.ecr.aws/debian/arm64:bullseye
  - image: public.ecr.aws/debian/i386:bullseye
  - image: public.ecr.aws/debian/mips64el:bullseye
  - image: public.ecr.aws/debian/ppc64el:bullseye
  - image: public.ecr.aws/debian/s390x:bullseye

(I have a whole series of very similar YAMLs, but this is the first one.)

In both cases I'm invoking via manifest-tool --debug --username AWS --password "$token" push from-spec --ignore-missing manifest.yml (where $token is acquired via aws ecr-public get-login-password --region us-east-1, and has been used successfully in this same way via ctr for pushing the non-manifest-list images).

2.0 debug logs:
time="2021-07-10T22:31:30Z" level=info msg="Retrieving digests of member images"
time="2021-07-10T22:31:30Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:30Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/amd64/manifests/bullseye"
time="2021-07-10T22:31:31Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=58 response.header.content-type="application/json; charset=utf-8" response.header.date="Sat, 10 Jul 2021 22:31:31 GMT" response.header.docker-distribution-api-version=registry/2.0 response.header.www-authenticate="Bearer realm=\"https://public.ecr.aws/token/\",service=\"public.ecr.aws\",scope=\"aws\"" response.status="401 Unauthorized" url="https://public.ecr.aws/v2/debian/amd64/manifests/bullseye"
time="2021-07-10T22:31:31Z" level=debug msg=Unauthorized header="Bearer realm=\"https://public.ecr.aws/token/\",service=\"public.ecr.aws\",scope=\"aws\"" host=public.ecr.aws
time="2021-07-10T22:31:31Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/amd64/manifests/bullseye"
time="2021-07-10T22:31:31Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:31 GMT" response.header.docker-content-digest="sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/amd64/manifests/bullseye"
time="2021-07-10T22:31:31Z" level=debug msg=resolved desc.digest="sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6" host=public.ecr.aws
time="2021-07-10T22:31:31Z" level=debug msg=fetch digest="sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:31Z" level=debug msg="do request" digest="sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/amd64/manifests/sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6"
time="2021-07-10T22:31:31Z" level=debug msg="fetch response received" digest="sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:31 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/amd64/manifests/sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6"
time="2021-07-10T22:31:31Z" level=debug msg=fetch digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json size=453
time="2021-07-10T22:31:31Z" level=debug msg="do request" digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=453 url="https://public.ecr.aws/v2/debian/amd64/blobs/sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5"
time="2021-07-10T22:31:31Z" level=debug msg="fetch response received" digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=306 response.header.content-length=453 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:26 GMT" response.header.etag="\"3e1088372efc5b642e943bb68d9c078a-1\"" response.header.last-modified="Fri, 09 Jul 2021 23:13:52 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="4GPZXUd6Y2Hgom031YFNqyTsTi6SAqELm_uguKjyvsWkMpzJ6ED6jQ==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=GgK7gcjkSCIM6gT8plWkeZeNl83xt9wU response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=453 url="https://public.ecr.aws/v2/debian/amd64/blobs/sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5"
time="2021-07-10T22:31:31Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:31Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/armel/manifests/bullseye"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:32 GMT" response.header.docker-content-digest="sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/armel/manifests/bullseye"
time="2021-07-10T22:31:32Z" level=debug msg=resolved desc.digest="sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee" host=public.ecr.aws
time="2021-07-10T22:31:32Z" level=debug msg=fetch digest="sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:32Z" level=debug msg="do request" digest="sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/armel/manifests/sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" digest="sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:32 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/armel/manifests/sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee"
time="2021-07-10T22:31:32Z" level=debug msg=fetch digest="sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39" mediatype=application/vnd.docker.container.image.v1+json size=466
time="2021-07-10T22:31:32Z" level=debug msg="do request" digest="sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=466 url="https://public.ecr.aws/v2/debian/armel/blobs/sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" digest="sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=306 response.header.content-length=466 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:27 GMT" response.header.etag="\"4422126726612b85157b424ddb55a031-1\"" response.header.last-modified="Sat, 10 Jul 2021 21:17:10 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="v66HrdGYU2-TqWuOrBWsDVkHEsSYrqrZMet0zRGjgwaG9cwGthhKIg==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=Cnv6eayf.6cBF4hrGc6UGduitZ4U9vCB response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=466 url="https://public.ecr.aws/v2/debian/armel/blobs/sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39"
time="2021-07-10T22:31:32Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:32Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/armhf/manifests/bullseye"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:32 GMT" response.header.docker-content-digest="sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/armhf/manifests/bullseye"
time="2021-07-10T22:31:32Z" level=debug msg=resolved desc.digest="sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad" host=public.ecr.aws
time="2021-07-10T22:31:32Z" level=debug msg=fetch digest="sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:32Z" level=debug msg="do request" digest="sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/armhf/manifests/sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" digest="sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:32 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/armhf/manifests/sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad"
time="2021-07-10T22:31:32Z" level=debug msg=fetch digest="sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1" mediatype=application/vnd.docker.container.image.v1+json size=466
time="2021-07-10T22:31:32Z" level=debug msg="do request" digest="sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=466 url="https://public.ecr.aws/v2/debian/armhf/blobs/sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1"
time="2021-07-10T22:31:32Z" level=debug msg="fetch response received" digest="sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=305 response.header.content-length=466 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:28 GMT" response.header.etag="\"e52c1a3701149dc170a9fe68875c3e7d-1\"" response.header.last-modified="Sat, 10 Jul 2021 20:55:36 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="xkD7oPBLW5FKlqx-VV-8vM2ByIul0FL93dhhsjLrewlz0Ah8hKAihQ==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=p.I_2WpG2eDCVcDyexVL1Vfi8Mtyi0Y0 response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=466 url="https://public.ecr.aws/v2/debian/armhf/blobs/sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1"
time="2021-07-10T22:31:32Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:32Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/arm64/manifests/bullseye"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:33 GMT" response.header.docker-content-digest="sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/arm64/manifests/bullseye"
time="2021-07-10T22:31:33Z" level=debug msg=resolved desc.digest="sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e" host=public.ecr.aws
time="2021-07-10T22:31:33Z" level=debug msg=fetch digest="sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:33Z" level=debug msg="do request" digest="sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/arm64/manifests/sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" digest="sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:33 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/arm64/manifests/sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e"
time="2021-07-10T22:31:33Z" level=debug msg=fetch digest="sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2" mediatype=application/vnd.docker.container.image.v1+json size=468
time="2021-07-10T22:31:33Z" level=debug msg="do request" digest="sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=468 url="https://public.ecr.aws/v2/debian/arm64/blobs/sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" digest="sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=305 response.header.content-length=468 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:28 GMT" response.header.etag="\"05e129e78905c5525dd2b0e78b8ada63-1\"" response.header.last-modified="Sat, 10 Jul 2021 21:04:54 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="qQ78IwQBqXLhobHbICvAXoVXT9f6Mb7SbCMi90YdJfqHfvxFPjdOCQ==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=mn8appdXhsaR3FWEJGCU9qk1ciDwHXZ_ response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=468 url="https://public.ecr.aws/v2/debian/arm64/blobs/sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2"
time="2021-07-10T22:31:33Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:33Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/i386/manifests/bullseye"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:33 GMT" response.header.docker-content-digest="sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/i386/manifests/bullseye"
time="2021-07-10T22:31:33Z" level=debug msg=resolved desc.digest="sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8" host=public.ecr.aws
time="2021-07-10T22:31:33Z" level=debug msg=fetch digest="sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:33Z" level=debug msg="do request" digest="sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/i386/manifests/sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" digest="sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:33 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/i386/manifests/sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8"
time="2021-07-10T22:31:33Z" level=debug msg=fetch digest="sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7" mediatype=application/vnd.docker.container.image.v1+json size=450
time="2021-07-10T22:31:33Z" level=debug msg="do request" digest="sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=450 url="https://public.ecr.aws/v2/debian/i386/blobs/sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7"
time="2021-07-10T22:31:33Z" level=debug msg="fetch response received" digest="sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=304 response.header.content-length=450 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:29 GMT" response.header.etag="\"c77863690636692cba78b3bbe99ea6e2-1\"" response.header.last-modified="Sat, 10 Jul 2021 20:53:00 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="6-WIM189oxETLioI_jAe8UBGGj-Jam0y_bCg5d67RU6NjOf0nKaRHQ==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=pJs76j0mMBZXFsn04XUaR3HKy9fcS4yu response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=450 url="https://public.ecr.aws/v2/debian/i386/blobs/sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7"
time="2021-07-10T22:31:33Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:33Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/mips64el/manifests/bullseye"
time="2021-07-10T22:31:34Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:34 GMT" response.header.docker-content-digest="sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/mips64el/manifests/bullseye"
time="2021-07-10T22:31:34Z" level=debug msg=resolved desc.digest="sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6" host=public.ecr.aws
time="2021-07-10T22:31:34Z" level=debug msg=fetch digest="sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:34Z" level=debug msg="do request" digest="sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/mips64el/manifests/sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6"
time="2021-07-10T22:31:34Z" level=debug msg="fetch response received" digest="sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:34 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/mips64el/manifests/sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6"
time="2021-07-10T22:31:34Z" level=debug msg=fetch digest="sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb" mediatype=application/vnd.docker.container.image.v1+json size=459
time="2021-07-10T22:31:34Z" level=debug msg="do request" digest="sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=459 url="https://public.ecr.aws/v2/debian/mips64el/blobs/sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb"
time="2021-07-10T22:31:34Z" level=debug msg="fetch response received" digest="sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=305 response.header.content-length=459 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:30 GMT" response.header.etag="\"bd7626bb96781a30f630569112e9f3a1-1\"" response.header.last-modified="Sat, 10 Jul 2021 21:06:14 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="rBbOQuXrFxlyWg0LTUUqHoD1_rZ0P3l9HY53Xkan99k-KogLwgDL5g==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=CY3ORVygvkEBqz5lb9dtTeNAHiz1Dveu response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=459 url="https://public.ecr.aws/v2/debian/mips64el/blobs/sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb"
time="2021-07-10T22:31:34Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:34Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/ppc64el/manifests/bullseye"
time="2021-07-10T22:31:34Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:34 GMT" response.header.docker-content-digest="sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/ppc64el/manifests/bullseye"
time="2021-07-10T22:31:34Z" level=debug msg=resolved desc.digest="sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386" host=public.ecr.aws
time="2021-07-10T22:31:34Z" level=debug msg=fetch digest="sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:34Z" level=debug msg="do request" digest="sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/ppc64el/manifests/sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386"
time="2021-07-10T22:31:34Z" level=debug msg="fetch response received" digest="sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:34 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/ppc64el/manifests/sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386"
time="2021-07-10T22:31:34Z" level=debug msg=fetch digest="sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0" mediatype=application/vnd.docker.container.image.v1+json size=457
time="2021-07-10T22:31:34Z" level=debug msg="do request" digest="sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=457 url="https://public.ecr.aws/v2/debian/ppc64el/blobs/sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" digest="sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=305 response.header.content-length=457 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:31 GMT" response.header.etag="\"2bb05b4b42f8f2d4db4a538ec821f837-1\"" response.header.last-modified="Sat, 10 Jul 2021 21:10:54 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="IfgqNAOaETtscoyu8FpI2Yj4k4zpbXFp6lzogalV1_6892BzKI-Gzw==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=3rjiwdOfuDmAeyGK_J003gfZ8pZQdwwv response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=457 url="https://public.ecr.aws/v2/debian/ppc64el/blobs/sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0"
time="2021-07-10T22:31:35Z" level=debug msg=resolving host=public.ecr.aws
time="2021-07-10T22:31:35Z" level=debug msg="do request" host=public.ecr.aws request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://public.ecr.aws/v2/debian/s390x/manifests/bullseye"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" host=public.ecr.aws response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:35 GMT" response.header.docker-content-digest="sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" url="https://public.ecr.aws/v2/debian/s390x/manifests/bullseye"
time="2021-07-10T22:31:35Z" level=debug msg=resolved desc.digest="sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78" host=public.ecr.aws
time="2021-07-10T22:31:35Z" level=debug msg=fetch digest="sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78" mediatype=application/vnd.docker.distribution.manifest.v2+json size=429
time="2021-07-10T22:31:35Z" level=debug msg="do request" digest="sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78" mediatype=application/vnd.docker.distribution.manifest.v2+json request.header.accept="application/vnd.docker.distribution.manifest.v2+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=429 url="https://public.ecr.aws/v2/debian/s390x/manifests/sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" digest="sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78" mediatype=application/vnd.docker.distribution.manifest.v2+json response.header.content-length=429 response.header.content-type=application/vnd.docker.distribution.manifest.v2+json response.header.date="Sat, 10 Jul 2021 22:31:35 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=429 url="https://public.ecr.aws/v2/debian/s390x/manifests/sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78"
time="2021-07-10T22:31:35Z" level=debug msg=fetch digest="sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0" mediatype=application/vnd.docker.container.image.v1+json size=453
time="2021-07-10T22:31:35Z" level=debug msg="do request" digest="sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=GET size=453 url="https://public.ecr.aws/v2/debian/s390x/blobs/sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" digest="sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0" mediatype=application/vnd.docker.container.image.v1+json response.header.accept-ranges=bytes response.header.age=304 response.header.content-length=453 response.header.content-type=application/octet-stream response.header.date="Sat, 10 Jul 2021 22:26:32 GMT" response.header.etag="\"326b09df25161f18b648cc1d8a18d47e-1\"" response.header.last-modified="Sat, 10 Jul 2021 21:16:49 GMT" response.header.server=AmazonS3 response.header.via="1.1 c1c7bd66e338154bf556b9c8414debe9.cloudfront.net (CloudFront)" response.header.x-amz-cf-id="Nv-1neJ8En2WtIkHvBdmFVxN0lULhf1MoM25ZIyN2YQmjb57D4-RVg==" response.header.x-amz-cf-pop=HIO50-C2 response.header.x-amz-server-side-encryption=AES256 response.header.x-amz-version-id=k6hLeQyno9LE6iNAQ0zuRYydWGxW8bRT response.header.x-cache="Hit from cloudfront" response.status="200 OK" size=453 url="https://public.ecr.aws/v2/debian/s390x/blobs/sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0"
time="2021-07-10T22:31:35Z" level=debug msg=push digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=53547954
time="2021-07-10T22:31:35Z" level=debug msg="checking and pushing to" digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=53547954 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8"
time="2021-07-10T22:31:35Z" level=debug msg="do request" digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip request.header.accept="application/vnd.docker.image.rootfs.diff.tar.gzip, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD size=53547954 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8"
time="2021-07-10T22:31:35Z" level=debug msg=push digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json size=453
time="2021-07-10T22:31:35Z" level=debug msg="checking and pushing to" digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json size=453 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5"
time="2021-07-10T22:31:35Z" level=debug msg="do request" digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD size=453 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" mediatype=application/vnd.docker.container.image.v1+json response.header.content-length=453 response.header.content-type=application/vnd.docker.container.image.v1+json response.header.date="Sat, 10 Jul 2021 22:31:35 GMT" response.header.docker-content-digest="sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5" response.header.docker-distribution-api-version=registry/2.0 response.status="200 OK" size=453 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5"
time="2021-07-10T22:31:35Z" level=debug msg="fetch response received" digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip response.header.date="Sat, 10 Jul 2021 22:31:35 GMT" response.header.docker-distribution-api-version=registry/2.0 response.status="404 Not Found" size=53547954 url="https://public.ecr.aws/v2/debian/debian/blobs/sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8"
time="2021-07-10T22:31:35Z" level=debug msg="do request" digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=POST size=53547954 url="https://public.ecr.aws/v2/debian/debian/blobs/uploads/?mount=sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8&from=debian/amd64"
time="2021-07-10T22:31:36Z" level=debug msg="fetch response received" digest="sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip response.header.date="Sat, 10 Jul 2021 22:31:36 GMT" response.header.docker-distribution-api-version=registry/2.0 response.header.location="https://public.ecr.aws/v2/debian/debian/blobs/uploads/051a1b07-ec0e-45a1-a819-e7a5e7a62feb" response.header.range="bytes=0-10485760" response.status="202 Accepted" size=53547954 url="https://public.ecr.aws/v2/debian/debian/blobs/uploads/?mount=sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8&from=debian/amd64"
time="2021-07-10T22:31:36Z" level=fatal msg="Error pushing target manifest component reference: public.ecr.aws/debian/debian@sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6: not_found"
1.0 debug logs:
time="2021-07-10T22:39:53Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:39:53Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc0003a4600}]"
time="2021-07-10T22:39:53Z" level=debug msg="repoName: debian/debian"
time="2021-07-10T22:39:53Z" level=info msg="Retrieving digests of images..."
time="2021-07-10T22:39:53Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:39:53Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000098c00}]"
time="2021-07-10T22:39:53Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/amd64 repository from https://public.ecr.aws v2"
time="2021-07-10T22:39:55Z" level=info msg="Image \"public.ecr.aws/debian/amd64:bullseye\" is digest sha256:33e8e98400de9f71db757d06cc58c0e07c108c6aa8212da59102e3559bf9a1f6; size: 429"
time="2021-07-10T22:39:55Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/amd64:bullseye\" to blob mount requests"
time="2021-07-10T22:39:55Z" level=debug msg="Adding manifest \"debian/amd64\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:39:55Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:39:55Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000099380}]"
time="2021-07-10T22:39:55Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/armel repository from https://public.ecr.aws v2"
time="2021-07-10T22:39:57Z" level=info msg="Image \"public.ecr.aws/debian/armel:bullseye\" is digest sha256:e63bc6535e056306295f95742c47faf369d33c922af24a1a6bc7c21f636bf3ee; size: 429"
time="2021-07-10T22:39:57Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/armel:bullseye\" to blob mount requests"
time="2021-07-10T22:39:57Z" level=debug msg="Adding manifest \"debian/armel\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:39:57Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:39:57Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000098c00}]"
time="2021-07-10T22:39:57Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/armhf repository from https://public.ecr.aws v2"
time="2021-07-10T22:39:59Z" level=info msg="Image \"public.ecr.aws/debian/armhf:bullseye\" is digest sha256:0e4cd553eecdbb95ff49284c9e64614cf51be0bdf2756c3128b71ba713299fad; size: 429"
time="2021-07-10T22:39:59Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/armhf:bullseye\" to blob mount requests"
time="2021-07-10T22:39:59Z" level=debug msg="Adding manifest \"debian/armhf\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:39:59Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:39:59Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc00020cd80}]"
time="2021-07-10T22:39:59Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/arm64 repository from https://public.ecr.aws v2"
time="2021-07-10T22:40:01Z" level=info msg="Image \"public.ecr.aws/debian/arm64:bullseye\" is digest sha256:b1299e622dae9fe202eb51c14fe8e0f1536f8734f468e6a6e2afe4896015c36e; size: 429"
time="2021-07-10T22:40:01Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/arm64:bullseye\" to blob mount requests"
time="2021-07-10T22:40:01Z" level=debug msg="Adding manifest \"debian/arm64\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:40:01Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:40:01Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000382180}]"
time="2021-07-10T22:40:01Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/i386 repository from https://public.ecr.aws v2"
time="2021-07-10T22:40:03Z" level=info msg="Image \"public.ecr.aws/debian/i386:bullseye\" is digest sha256:d80ca89b23183ee1f155bee8084bf6a3f1096090ffd43ae9f97dc7aabc19d3d8; size: 429"
time="2021-07-10T22:40:03Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/i386:bullseye\" to blob mount requests"
time="2021-07-10T22:40:03Z" level=debug msg="Adding manifest \"debian/i386\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:40:03Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:40:03Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000382f00}]"
time="2021-07-10T22:40:03Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/mips64el repository from https://public.ecr.aws v2"
time="2021-07-10T22:40:05Z" level=info msg="Image \"public.ecr.aws/debian/mips64el:bullseye\" is digest sha256:8554bd94e4398d5e00dba4c59aa3a8c043c69c24a774361501f4404453ea57d6; size: 429"
time="2021-07-10T22:40:05Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/mips64el:bullseye\" to blob mount requests"
time="2021-07-10T22:40:05Z" level=debug msg="Adding manifest \"debian/mips64el\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:40:05Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:40:05Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000099b00}]"
time="2021-07-10T22:40:05Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/ppc64el repository from https://public.ecr.aws v2"
time="2021-07-10T22:40:07Z" level=info msg="Image \"public.ecr.aws/debian/ppc64el:bullseye\" is digest sha256:3aa0b30561cd4d236caa595854569fe0e9fbdca5e2a508aec259b85cf59df386; size: 429"
time="2021-07-10T22:40:07Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/ppc64el:bullseye\" to blob mount requests"
time="2021-07-10T22:40:07Z" level=debug msg="Adding manifest \"debian/ppc64el\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:40:07Z" level=debug msg="hostDir: /etc/docker/certs.d/public.ecr.aws"
time="2021-07-10T22:40:07Z" level=debug msg="endpoints: [{false https://public.ecr.aws v2 false false true 0xc000098d80}]"
time="2021-07-10T22:40:07Z" level=debug msg="Trying to fetch image manifest of public.ecr.aws/debian/s390x repository from https://public.ecr.aws v2"
time="2021-07-10T22:40:09Z" level=info msg="Image \"public.ecr.aws/debian/s390x:bullseye\" is digest sha256:6238afc51456c03370ea094b6228e94bbc5024a34a6403c84c7995b44af7cb78; size: 429"
time="2021-07-10T22:40:09Z" level=debug msg="Adding manifest references of \"public.ecr.aws/debian/s390x:bullseye\" to blob mount requests"
time="2021-07-10T22:40:09Z" level=debug msg="Adding manifest \"debian/s390x\" -> to be pushed to \"debian/debian\" as a manifest reference"
time="2021-07-10T22:40:09Z" level=debug msg="Manifest list push url: https://public.ecr.aws/v2/debian/debian/manifests/bullseye"
time="2021-07-10T22:40:09Z" level=debug msg="mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json"
time="2021-07-10T22:40:10Z" level=debug msg="Mount of blob sha256:f493583facd7ea0008e0a87c92f759047b3a82397113dd295a52057fcff3a7d5 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/0eeb73b8-b13a-4a4b-9e94-7cfc34aabdcf\""
time="2021-07-10T22:40:11Z" level=debug msg="Mount of blob sha256:359a78ec7f4b35efd70351fa5d3c5bcf1d5d3de554e719543737d236b5b7a8c8 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/cce5a3b5-5f5a-4b10-8cfe-f455665adb20\""
time="2021-07-10T22:40:11Z" level=debug msg="Mount of blob sha256:c56e1f0fb439e41795f83b3be708b85b47dd04e3800838d57b61728c999f7f39 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/aa2c289d-0b6e-4bc8-83da-a4cc3ee6d67e\""
time="2021-07-10T22:40:12Z" level=debug msg="Mount of blob sha256:b865a52d93ad7521c2ece3878f1db27a359aeec5146beb7fa5419e141fc0f5a9 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/4ebdfd9e-26b5-478e-8091-6474762aef6e\""
time="2021-07-10T22:40:13Z" level=debug msg="Mount of blob sha256:354af0a15484fce679fbf48b7b144fc9b1dd102f94ecca3e8dbf9abc3badd3d1 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/ee4748ae-3d2a-4c6e-9670-982e85598f4e\""
time="2021-07-10T22:40:14Z" level=debug msg="Mount of blob sha256:0a8857293d8fd5045282b48be6486c08245f38003b2933842c24bc8ef9cc23cc succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/8d7b1b02-24b4-4ae5-8e03-d73ea8b9122f\""
time="2021-07-10T22:40:14Z" level=debug msg="Mount of blob sha256:3b897f497731bbf2168a2e8400434f58e2f75ded37bfa23c9948879249c7e6f2 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/98057141-a5cb-4952-bac7-c7bc22be8cea\""
time="2021-07-10T22:40:15Z" level=debug msg="Mount of blob sha256:5da4b0c1bed67ff05224d1011950708d58470cba6df82cc3e07a686cb1b77aef succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/5dccbf50-efbc-4151-941a-12e0bd1b1eee\""
time="2021-07-10T22:40:16Z" level=debug msg="Mount of blob sha256:87bd2381f192dfba0c24e34dc52aa88c8bf983c2b37b09906b2005c3c820d0b7 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/fdf8c300-b4ea-4744-aaad-5c7d5e1ee058\""
time="2021-07-10T22:40:17Z" level=debug msg="Mount of blob sha256:383eed2c9e589ef048cc52e7a312a0d728210881d6922db32d35fa46fa2535a8 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/161dda77-02e2-46dc-9de1-2e65036cbaf1\""
time="2021-07-10T22:40:17Z" level=debug msg="Mount of blob sha256:0ef360681d84c8183ee0bf2a4fa787d6b71f58eea1be3fb200da9a014686e2bb succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/9de273b7-3d3f-42b1-a393-7f1ad98bfd6a\""
time="2021-07-10T22:40:18Z" level=debug msg="Mount of blob sha256:bf5f5db9121a9438f7970ed0c40f8fe01766c9db06ba19efae7f87279f1bbb46 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/981d3b49-3a0a-4c04-808d-9d4ceb90bfc5\""
time="2021-07-10T22:40:19Z" level=debug msg="Mount of blob sha256:8bf31c81b503b8f5e0fa82baf0ff278ba0f6d075a1738b34ccb2f376b6a6cfd0 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/68e658d2-e2f0-49e9-8d62-b419f2b45e4a\""
time="2021-07-10T22:40:20Z" level=debug msg="Mount of blob sha256:a3c8f207de33a85c36d5935894312f1fbf2ce1e114e62f71915729b3b9c94e20 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/cce0abac-14e6-415d-a6ea-b695cfab4818\""
time="2021-07-10T22:40:21Z" level=debug msg="Mount of blob sha256:e782bae23450c1a9e2932a2317c3742d6bf5f3136bb6e8e19778357024dcc8b0 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/0cce58e9-aec9-4411-8ea7-27a480a6c911\""
time="2021-07-10T22:40:21Z" level=debug msg="Mount of blob sha256:a8f43b4f7f6b0f32e456665d00527fd7e0c39dcc3b3bc5b02c3e28110fc7fe42 succeeded, location: \"https://public.ecr.aws/v2/debian/debian/blobs/uploads/8739586a-a4b6-4c53-ae25-47cedb49cb9e\""
time="2021-07-10T22:40:21Z" level=debug msg="manifest reference push URL: https://public.ecr.aws/v2/debian/debian/manifests/bullseye"
time="2021-07-10T22:40:22Z" level=fatal msg="Couldn't push manifests referenced in our manifest list: Referenced manifest push unsuccessful: response 404: 404 Not Found"

(I know I said in #123 that I don't have any real YAML that omit platform: but I swear I hadn't written this one yet when I wrote that! Fixing that is what reminded me this was possible. 😇)

Any help or pointers would be hugely appreciated. 🙏 ❤️

Failed to push manifest to a private registry

Failed log:

Putting 192.168.0.2:30003/ubuntu:18.04
$ manifest-tool ["--debug" "--username" "admin" "--password" "xxx" "push" "from-spec" "--ignore-missing" "/tmp/bashbrew-manifest-tool-yaml-272228480"]
time="2020-12-22T16:22:07+08:00" level=info msg="Retrieving digests of member images"
time="2020-12-22T16:22:07+08:00" level=debug msg=resolving host="192.168.0.2:30003"
...
time="2020-12-22T16:22:08+08:00" level=debug msg=push digest="sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=26713582
time="2020-12-22T16:22:08+08:00" level=debug msg="checking and pushing to" digest="sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=26713582 url="https://192.168.0.2:30003/v2/ubuntu/blobs/sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609"
time="2020-12-22T16:22:08+08:00" level=debug msg="do request" digest="sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip request.header.accept="application/vnd.docker.image.rootfs.diff.tar.gzip, */*" request.header.user-agent=containerd/1.4.3+unknown request.method=HEAD size=26713582 url="https://192.168.0.2:30003/v2/ubuntu/blobs/sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609"
time="2020-12-22T16:22:08+08:00" level=debug msg=push digest="sha256:b19b8af32973956e8e43bb3df43cb9b611b14021752275f1dd7d12ee575bd036" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=860
time="2020-12-22T16:22:08+08:00" level=debug msg="checking and pushing to" digest="sha256:b19b8af32973956e8e43bb3df43cb9b611b14021752275f1dd7d12ee575bd036" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip size=860 url="https://192.168.0.2:30003/v2/ubuntu/blobs/sha256:b19b8af32973956e8e43bb3df43cb9b611b14021752275f1dd7d12ee575bd036"
time="2020-12-22T16:22:08+08:00" level=debug msg="do request" digest="sha256:b19b8af32973956e8e43bb3df43cb9b611b14021752275f1dd7d12ee575bd036" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip request.header.accept="application/vnd.docker.image.rootfs.diff.tar.gzip, */*" request.header.user-agent=containerd/1.4.3+unknown request.method=HEAD size=860 url="https://192.168.0.2:30003/v2/ubuntu/blobs/sha256:b19b8af32973956e8e43bb3df43cb9b611b14021752275f1dd7d12ee575bd036"
time="2020-12-22T16:22:08+08:00" level=debug msg="fetch response received" digest="sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609" mediatype=application/vnd.docker.image.rootfs.diff.tar.gzip response.header.connection=keep-alive response.header.content-length=93 response.header.content-type="application/json; charset=utf-8" response.header.date="Tue, 22 Dec 2020 08:22:08 GMT" response.header.server=nginx response.header.x-request-id=dac42434-ab79-470c-83b4-7d3133dfce31 response.status="400 Bad Request" size=26713582 url="https://192.168.0.2:30003/v2/ubuntu/blobs/sha256:6c5bd54c6d89dd69606bd062936eb16ffde24cf5d52cb66bb57989c1cf841609"
time="2020-12-22T16:22:08+08:00" level=fatal msg="Error pushing target manifest component reference: 192.168.0.2:30003/ubuntu@sha256:17485683d2b9122b2c979728834b97b521ddcdaa824dbaaeb73b9bcd4887e66a: unexpected response: 400 Bad Request"

I use harbor 2.1 to setup registry, images of amd64/arm32v7/arm64v8 exist, but with multi-manifests, it fails to push.
The 192.168.0.2:30003/ubuntu@sha256:17485683d2b9122b2c979728834b97b521ddcdaa824dbaaeb73b9bcd4887e66a does not exist while it is normal since i want to push it as totally new i think.

Since it exists root path, i do not create a sub-project like amd64 does.

Documentation Notice: `push from-args` is overwrite, not append.

A major caveat on DockerHub (not your fault) of push from-args is that the operation overwrites what is there, not appends.

This means, you can not dynamically add additional architectures to a pre-existing list or do a multiple-builds and have them join up under 1 tag, you must have the complete list, and push it only at the end when all builds are complete.

I think this should be called out, in documentation, somewhere. I spent 4 hours wondering why my multi-architecture builds were not showing. 😠

/ # ./manifest-tool inspect jnovack/autossh:test
Name:   jnovack/autossh:test (Type: application/vnd.docker.distribution.manifest.list.v2+json)
Digest: sha256:3bf6448f1d1ab44c2691d37ad5272afc3364eaecb5b8c815098f9fd5bedd7ed9
 * Contains 1 manifest references:
1    Mfst Type: application/vnd.docker.distribution.manifest.v2+json
1       Digest: sha256:876d2648e610fdf224246561d57bd340316ad73d9cf8c6b94c8f19935b66db46
1  Mfst Length: 1157
1     Platform:
1           -      OS: linux
1           - OS Vers:
1           - OS Feat: []
1           -    Arch: arm
1           - Variant:
1           - Feature:
1     # Layers: 4
         layer 1: digest = sha256:52278dd8e57993669c5b72a9620e89bebdc098f2af2379caaa8945f7403f77a2
         layer 2: digest = sha256:cd1a4a0564f1988e37a1cb0380397a2db9f28824ac7c1abdb855201bc72cccd0
         layer 3: digest = sha256:772672a29dadab958356b473b3f8487ecc6c681e142fb5b60f8e852282f13988
         layer 4: digest = sha256:40f3bdac7e4592aeb10960ab7bef50f66f1e92195aa0d26bcda2e543babed85f

/ # ./manifest-tool push from-args --platforms linux/arm64 --template jnovack/autossh:v2.0-arm64v8 --target jnovack/autossh:test
Digest: sha256:8285c7c23832ca45fe478d46376a4c56fd8392c213e9312ad0055b34c3da6b89 434

/ # ./manifest-tool inspect jnovack/autossh:test
Name:   jnovack/autossh:test (Type: application/vnd.docker.distribution.manifest.list.v2+json)
Digest: sha256:8285c7c23832ca45fe478d46376a4c56fd8392c213e9312ad0055b34c3da6b89
 * Contains 1 manifest references:
1    Mfst Type: application/vnd.docker.distribution.manifest.v2+json
1       Digest: sha256:575c937126cbdef12e64b98366c6901c213e93b1e645fbeed0cb6369464b17d6
1  Mfst Length: 1157
1     Platform:
1           -      OS: linux
1           - OS Vers:
1           - OS Feat: []
1           -    Arch: arm64
1           - Variant:
1           - Feature:
1     # Layers: 4
         layer 1: digest = sha256:b538f80385f9b48122e3da068c932a96ea5018afa3c7be79da00437414bd18cd
         layer 2: digest = sha256:e47f356fda3fcbd5ce6a215c9910b4dbf57ac7e423dffc227de544d1e74d6a28
         layer 3: digest = sha256:207cbbd7dc95f863704f1b187b77a6eeda0c82edcb0f491365c29da0e32b295b
         layer 4: digest = sha256:250a14336a497fb414bbda6e0c4882e6af6b4485e7784a64b159a6af4dcfbe3b

Should I re-push manifest each time I update my image ?

I am building multi-arch images across s390x and amd64.
Say I have a image manifest like

image: swangbj/gosdk:latest
tags: ['latest']
manifests:
  -
    image: swangbj/gosdk:s390x-latest
    platform:
      architecture: s390x
      os: linux
  -
    image: swangbj/gosdk:amd64-latest
    platform:
      architecture: amd64
      os: linux

And I pushed the manifest file and the images swangbj/gosdk:s390x-latest and swangbj/gosdk:amd64-latest to the docker hub. After that , I can pull images in different architecture with same tag swangbj/gosdk:latest.
But after I pushed the new image swangbj/gosdk:s390x-latest,it seems I can't get the updated image by using swangbj/gosdk:latest.It always give me the old one .

macOS - ARM build

Hi, can you please build also darwin_arm64 binaries? For new Apple Macs with M1 chips.

Wishlist: --skip-missing / --ignore-missing

I'm not picky about the flag name, but having some way to tell manifest-list push that I'd like it to ignore/skip images which don't exist (and simply not include them in the manifest list it creates) would be a really nice addition (and would save my wrapping code from needing to do manifest-tool inspect while it generates YAML just so that manifest-tool push ... can inspect yet again...).

I'd be happy to try my hand at implementing this if it's something you're amenable to. 👍

manifest-tool seems to be missing support for private registries running on http

[root@centos7 ~]# manifest pushml centos-manifest.yaml
INFO[0000] Retrieving digests of images...
INFO[0000] Image "172.30.172.11:5000/default/aarch64-centos:7" is digest sha256:5e96e595fef57a24e42924787ecb272dca6dae83d9e965471601b251e67eeafe; size: 1180
INFO[0000] Image "172.30.172.11:5000/default/centos:7" is digest sha256:8f3eea49e622b9cfb525616f74a33dd4b259e8ecaa107bb422bc9da91fad7ecb; size: 3393
FATA[0000] Failed to setup HTTP client to repository: Ping of V2 registry failed: Get https://172.30.172.11:5000/v2/: http: server gave HTTP response to HTTPS client

Does not work for Azure Container Registry (ACR)

I am able to pull and push using docker without any issues and I just used the standard docker login command.

Pushing MultiArch File /opt/vsts/work/_temp/748ea4a0-2253-467f-86c9-d117f52032e7/multiarch.yml using /opt/vsts/work/_tasks/PushDockerMultiArchTag_013ac686-e3c8-4414-aebd-15ec11e897ed/0.2.20/tools/manifest-tool-linux-amd64
time="2018-01-30T21:19:30Z" level=debug msg="endpoints: [{false https://itronarchcr.azurecr.io v2 false true 0xc420001c80} {false http://itronarchcr.azurecr.io v2 false true 0xc420001c80} {false https://itronarchcr.azurecr.io v1 false true 0xc420320600} {false http://itronarchcr.azurecr.io v1 false true 0xc420320600}]"
time="2018-01-30T21:19:30Z" level=debug msg="repoName: dotnet-build"
time="2018-01-30T21:19:30Z" level=info msg="Retrieving digests of images..."
time="2018-01-30T21:19:30Z" level=debug msg="authConfig for itronarchcr.azurecr.io: ********"
time="2018-01-30T21:19:30Z" level=debug msg="endpoints: [{false https://itronarchcr.azurecr.io v2 false true 0xc420001e00} {false http://itronarchcr.azurecr.io v2 false true 0xc420001e00}]"
time="2018-01-30T21:19:30Z" level=debug msg="Trying to fetch image manifest of itronarchcr.azurecr.io/dotnet-build repository from https://itronarchcr.azurecr.io v2"
time="2018-01-30T21:19:31Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-01-30T21:19:32Z" level=info msg="Image "itronarchcr.azurecr.io/dotnet-build:2.0.5-ci.master-windows" is digest sha256:29e0153aa5a02abd004553bdcefd267f9089d1f473ceca533f86820af9799c86; size: 3028"
time="2018-01-30T21:19:32Z" level=debug msg="authConfig for itronarchcr.azurecr.io: ********"
time="2018-01-30T21:19:32Z" level=debug msg="endpoints: [{false https://itronarchcr.azurecr.io v2 false true 0xc4202c4480} {false http://itronarchcr.azurecr.io v2 false true 0xc4202c4480}]"
time="2018-01-30T21:19:32Z" level=debug msg="Trying to fetch image manifest of itronarchcr.azurecr.io/dotnet-build repository from https://itronarchcr.azurecr.io v2"
time="2018-01-30T21:19:33Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-01-30T21:19:34Z" level=info msg="Image "itronarchcr.azurecr.io/dotnet-build:2.0.5-ci.master-linux" is digest sha256:771a838bb6e73addf6bde9f505098911c83c2dbf3aee8d6d6eb6451d8b5beba1; size: 2014"
time="2018-01-30T21:19:34Z" level=debug msg="Manifest list push url: https://itronarchcr.azurecr.io/v2/library/dotnet-build/manifests/2.0.5-ci.master"
time="2018-01-30T21:19:34Z" level=debug msg="mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json"
time="2018-01-30T21:19:34Z" level=debug msg="authConfig for itronarchcr.azurecr.io: ********"
time="2018-01-30T21:19:34Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-01-30T21:19:34Z" level=fatal msg="Registry push unsuccessful: response 401: 401 Unauthorized"

Missing os_version attribute in Windows images

I found a difference between the manifest-tool and the moby/moby#27455 PR for the "docker manifest" command.

After testing the "docker manifest" command I found out that such fat manifest list has the os_version attribute filled for the Windows image:

$ curl -sL https://registry.hub.docker.com/v2/repositories/stefanscherer/winspector/tags/1.7.1-test-pr27455 | jq -r .images
[
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "windows",
    "os_version": "10.0.14393.1198",
    "os_features": null
  },
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "linux",
    "os_version": null,
    "os_features": null
  }
]

My previous multi-os images for Linux + Windows do not have this os_version attribute filled:

$ curl -sL https://registry.hub.docker.com/v2/repositories/stefanscherer/winspector/tags/latest | jq -r .images
[
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "windows",
    "os_version": null,
    "os_features": null
  },
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "linux",
    "os_version": null,
    "os_features": null
  }
]

So it seems the different way to create the manifest list with the "docker manifest" command inherits this value - which is good to know which version of the Windows base image was used.

As it seems that Microsoft starts pushing multiarch images without this os_version attribute it is an indicate that they use manifest-tool to build and push it.

$ curl -sL https://registry.hub.docker.com/v2/repositories/microsoft/dotnet/tags/latest | jq -r .images
[
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "windows",
    "os_version": null,
    "os_features": null
  },
  {
    "size": null,
    "architecture": "amd64",
    "variant": null,
    "features": null,
    "os": "linux",
    "os_version": null,
    "os_features": null
  }
]

So it would be great to have the better filled metadata in manifest-tool as well until the docker manifest command is available.

Pushing a manifest list to a Azure Container repositries that has a tag count over 100 fails

Description:

Pushing a new manifest list to an azure container repositries that has a tag count over 100 will fail. An error mesage is shown that contains "unsupported protocol scheme". The manifest tool tries to determine the latest image with the V2 Container Registry API endpoint. The API respone is paged and delivers only the first 100 tag entries, based on this result a wrong tag is detrmined as the last version (see actual result). When is remove the tags completely (or partly so that the amount is under 100) the expected result is there.

Preconditions

  • manifest-tool-windows-amd64.exe (latest)
  • Container registry with a repository that has more than 100 tags

Steps to reproduce

  • "manifest-tool-windows-amd64.exe --debug --username --password push from-spec "

Expected result

This is the debug output when i removed all the existing tags (so wthis works)

PS C:\Temp> manifest-tool-windows-amd64.exe --debug --username <usr> --password <pass> push from-spec <file>
time="2018-12-19T10:30:21Z" level=debug msg="endpoints: [{false https://<crname>.azurecr.io v2 false true 0xc042037200} {false http://<name>.azurecr.io v2 false true 0xc042037200} {false https://<name>.azurecr.io v1 false true 0xc04203
7380} {false http://<name>.azurecr.io v1 false true 0xc042037380}]"
time="2018-12-19T10:30:21Z" level=debug msg="repoName: <imagename>"
time="2018-12-19T10:30:21Z" level=info msg="Retrieving digests of images..."
time="2018-12-19T10:30:21Z" level=debug msg="endpoints: [{false https://<name>.azurecr.io v2 false true 0xc042037680} {false http://<name>.azurecr.io v2 false true 0xc042037680}]"
time="2018-12-19T10:30:21Z" level=debug msg="Trying to fetch image manifest of elekta.azurecr.io/<imagename> repository from https://<name>.azurecr.io v2"
time="2018-12-19T10:30:22Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-12-19T10:30:23Z" level=info msg="Image \"<name>.azurecr.io/<imagename>:5.10.2-pullrequest0742-0011-windows-10.0.14393\" is digest sha256:c033f8b0551897d9ac29bd43a84b8b3360d9e503ee9edb3b397187
ba6504f41c; size: 3665"
time="2018-12-19T10:30:23Z" level=debug msg="endpoints: [{false https://<name>.azurecr.io v2 false true 0xc042308900} {false http://<name>.azurecr.io v2 false true 0xc042308900}]"
time="2018-12-19T10:30:23Z" level=debug msg="Trying to fetch image manifest of <name>.azurecr.io/<imagename> repository from https://<name>.azurecr.io v2"
time="2018-12-19T10:30:23Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-12-19T10:30:24Z" level=info msg="Image \"<name>.azurecr.io/<imagename>:5.10.2-pullrequest0742-0011-linux\" is digest sha256:65d5d822c17d32f7b8f466310877c4bcf8f147e281995a3163fbb6688a3f78cf; s
ize: 4495"
time="2018-12-19T10:30:24Z" level=debug msg="Manifest list push url: https://<name>.azurecr.io/v2/<imagename>/manifests/5.10.2-pullrequest0742-0011"
time="2018-12-19T10:30:24Z" level=debug msg="mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json"
time="2018-12-19T10:30:24Z" level=debug msg="Increasing token expiration to: 60 seconds"
Digest: sha256:82e6f46183a3780ca41eb0e03cfc15bbaf1371ea9f9c7c4f92c18178e6630a37 790

Actual result

This is the debug output when then the total tag count is over 100:

PS C:\Temp> manifest-tool-windows-amd64.exe --debug --username <usr> --password <pass> push from-spec <file>
time="2018-12-19T09:25:15Z" level=debug msg="endpoints: [{false https://<name>.azurecr.io v2 false true 0xc04208a900} {false http://<name>.azurecr.io v2 false true 0xc04208a900} {false https://<name>.azurecr.io v1 false true 0xc04208
aa80} {false http://<name>.azurecr.io v1 false true 0xc04208aa80}]"
time="2018-12-19T09:25:15Z" level=debug msg="repoName: <imagename>"
time="2018-12-19T09:25:15Z" level=info msg="Retrieving digests of images..."
time="2018-12-19T09:25:15Z" level=debug msg="endpoints: [{false https://<name>.azurecr.io v2 false true 0xc04208ad80} {false http://<name>.azurecr.io v2 false true 0xc04208ad80}]"
time="2018-12-19T09:25:15Z" level=debug msg="Trying to fetch image manifest of <name>.azurecr.io/<imagename> repository from https://<name>.azurecr.io v2"
time="2018-12-19T09:25:15Z" level=debug msg="Increasing token expiration to: 60 seconds"
time="2018-12-19T09:25:15Z" level=error msg="Error trying v2 registry: Get /v2/<imagename>/tags/list?last=5.1.0-pullrequest0340-0033&n=100&orderby=: unsupported protocol scheme \"\""
time="2018-12-19T09:25:15Z" level=debug msg="Skipping non-TLS endpoint http://<name>.azurecr.io for host/port that appears to use TLS"
time="2018-12-19T09:25:15Z" level=fatal msg="Inspect of image \"<name>.azurecr.io/<imagename>:5.10.2-pullrequest0742-0011-windows-10.0.1439\" failed with error: Get /v2/<image>/tags/list?last=5.1.0-pullrequest0340-0033&n=100&orderby=: unsupported protocol scheme \"\""

Unexpected EOF reading trailer

We use manifest-tool through Drone's plugins/manifest to build ARM and AMD64 images for Grafana Loki. Recently pushing the manifest has failed with the following message:

2020/02/07 19:46:14 pushing by spec
time="2020-02-07T19:46:15Z" level=error msg="Error trying v2 registry: http: unexpected EOF reading trailer" 
time="2020-02-07T19:46:15Z" level=fatal msg="Inspect of image \"grafana/loki:master-675a5f3-amd64\" failed with error: http: unexpected EOF reading trailer" 
2020/02/07 19:46:15 exit status 1

We've done a little bit of research and some results online suggested that we had too many docker images; we pruned all images older than 90 days, but the issue is still happening.

Note that if we re-run the job, sometimes the error won't happen. Any guidance here would be appreciated!

schema version 1 manifest shows as having zero layers

There was a blip of Docker Hub acting up recently while our arm64 server was pushing golang such that some of our tags managed to be pushed with a media type of application/vnd.docker.distribution.manifest.v1+json, which is all fine and well (docker pull can handle them just fine), but when inspecting them via manifest-tool, they show with Layers: 0:

$ manifest-tool inspect golang@sha256:7cf1f7ccf392bd834eb91f02892f48992d3c2ba292c2198315a4637bb9454c30
golang@sha256:7cf1f7ccf392bd834eb91f02892f48992d3c2ba292c2198315a4637bb9454c30: manifest type: application/vnd.docker.distribution.manifest.v1+json
      Digest: sha256:7cf1f7ccf392bd834eb91f02892f48992d3c2ba292c2198315a4637bb9454c30
Architecture: arm64
          OS: linux
    # Layers: 0

I tried to dig into the code to find out why, and found that https://github.com/estesp/manifest-tool/blob/0da654f67ac65e08a9a5b961f20123eb0e3d15e4/docker/inspect_v1.go appears to know how to parse that format, but for some reason doesn't seem to be getting invoked here or something? Sorry, not as familiar with the code/flow of this tool as I should be!

I also found the following which made me wonder if that makeImageInspect function perhaps needs to be updated to take v1 manifests into account?

// for manifest lists, we only want to display the basic info that this is
// a manifest list and its digest information:
if mediaType == manifestlist.MediaTypeManifestList {
return &types.ImageInspect{
MediaType: mediaType,
Digest: digest,
}
}

For reference, here's the "repo-info" output for that same digest: https://github.com/docker-library/repo-info/blob/5dc0a8675b5ee26e8fc8d59dd9567fc7687a547c/repos/golang/remote/1.12-alpine.md#golang112-alpine---linux-arm64-variant-v8

The code that parses the manifests to generate that is at: https://github.com/docker-library/repo-info/blob/5dc0a8675b5ee26e8fc8d59dd9567fc7687a547c/.remote.pl#L228-L278

See also docker-library/golang#269 (comment)

make binary is broken on master

I would like to use manifest-tool to investigate error messages I'm getting with docker hub (https://stackoverflow.com/questions/60632911/what-is-the-manifest-blob-unknown-blob-unknown-to-registry-error, any OT comment would be welcome).

I'm failing to compile it though (go version go1.14.3 darwin/amd64):

❯ make binary 
go build -ldflags "-X main.gitCommit="fa20a3b9b43f7c1acedb8d97c249803cc923e009"" -o manifest-tool github.com/estesp/manifest-tool
go: finding module for package github.com/estesp/manifest-tool
go: downloading github.com/estesp/manifest-tool v1.0.2
go: found github.com/estesp/manifest-tool in github.com/estesp/manifest-tool v1.0.2
go: finding module for package github.com/codegangsta/cli
go: finding module for package github.com/go-yaml/yaml
go: finding module for package github.com/docker/cli/cli/config
go: finding module for package github.com/vbatts/tar-split/tar/asm
go: downloading github.com/codegangsta/cli v1.22.4
go: downloading github.com/containerd/continuity v0.0.0-20181203112020-004b46473808
go: downloading github.com/go-yaml/yaml v2.1.0+incompatible
go: downloading github.com/docker/cli v17.12.1-ce-rc2+incompatible
go: downloading github.com/vbatts/tar-split v0.11.1
go: finding module for package github.com/vbatts/tar-split/tar/storage
go: finding module for package github.com/docker/libtrust
go: finding module for package github.com/docker/go-metrics
go: finding module for package github.com/opencontainers/runtime-spec/specs-go
go: finding module for package github.com/mattn/go-shellwords
go: downloading github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
go: downloading github.com/docker/go-metrics v0.0.1
go: downloading github.com/opencontainers/runtime-spec v1.0.2
go: found github.com/codegangsta/cli in github.com/codegangsta/cli v1.22.4
go: found github.com/go-yaml/yaml in github.com/go-yaml/yaml v2.1.0+incompatible
go: found github.com/docker/libtrust in github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7
go: found github.com/vbatts/tar-split/tar/asm in github.com/vbatts/tar-split v0.11.1
go: found github.com/mattn/go-shellwords in github.com/mattn/go-shellwords v1.0.10
go: found github.com/docker/go-metrics in github.com/docker/go-metrics v0.0.1
go: found github.com/opencontainers/runtime-spec/specs-go in github.com/opencontainers/runtime-spec v1.0.2
go: github.com/estesp/manifest-tool imports
        github.com/codegangsta/cli: github.com/codegangsta/[email protected]: parsing go.mod:
        module declares its path as: github.com/urfave/cli
                but was required as: github.com/codegangsta/cli
make: *** [binary] Error 1

In my experience this is typically caused by using module replacements directly instead of using the replace directive in go mod.

pushml failure

This is on Windows

C:\code\go\src\github.com\estesp\manifest-tool [master ≡ +2 ~0 -0 !]> cat .\registry-1-stage.docker.io.friism.golang.yml
image: registry-1-stage.docker.io/friism/golang:latest
manifests:
  -
    image: registry-1-stage.docker.io/friism/golang:linux
    platform:
      architecture: amd64
      os: linux
  -
    image: registry-1-stage.docker.io/friism/golang:windows
    platform:
      architecture: amd64
      os: windows
C:\code\go\src\github.com\estesp\manifest-tool [master ≡ +2 ~0 -0 !]> .\manifest-tool.exe pushml .\registry-1-stage.docker.io.friism.golang.yml
time="2016-04-14T17:39:30-07:00" level=info msg="Retrieving digests of images..."
time="2016-04-14T17:39:32-07:00" level=info msg="Image \"registry-1-stage.docker.io/friism/golang:linux\" is digest sha256:bc2864153bfe4821d22cf615dfa27fdc926c8e2b104205828a9c0db272e71c48; size: 8939"
panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x920440, 0xc082002030)
        C:/tools/go/src/runtime/panic.go:464 +0x3f4
github.com/estesp/manifest-tool/docker.PutManifestList(0xc0820a4370, 0xc082008300, 0x2e, 0x0, 0x0, 0x0, 0x0)
        C:/code/go/src/github.com/estesp/manifest-tool/docker/createml.go:74 +0x4a89
main.glob.func2(0xc0820a4370)
        C:/code/go/src/github.com/estesp/manifest-tool/pushml.go:16 +0x13a
github.com/estesp/manifest-tool/vendor/github.com/codegangsta/cli.Command.Run(0x9c8078, 0x6, 0x0, 0x0, 0xa7e9e0, 0x34, 0x0, 0x0, 0x0, 0x0, ...)
        C:/code/go/src/github.com/estesp/manifest-tool/vendor/github.com/codegangsta/cli/command.go:101 +0xdc4
github.com/estesp/manifest-tool/vendor/github.com/codegangsta/cli.(*App).Run(0xc082056780, 0xc08204a120, 0x3, 0x3, 0x0, 0x0)
        C:/code/go/src/github.com/estesp/manifest-tool/vendor/github.com/codegangsta/cli/app.go:127 +0xaa9
main.main()
        C:/code/go/src/github.com/estesp/manifest-tool/main.go:54 +0x5e5

application/vnd.docker.distribution.manifest.v1+prettyjws not supported

Not sure why not support the signed manifest. @estesp Could you help have a look when you're free? Thanks!

[jzhang@dhcp-140-36 manifest-tool]$ manifest-tool --version
manifest-tool version 2.0.0-beta.0 (commit: ff5aefe0f43b89efc21373c5514ef98a62c63e8a)

[jzhang@dhcp-140-36 manifest-tool]$ manifest-tool --debug inspect quay.io/openshift-qe-optional-operators/ocp4-index:latest
DEBU[0000] resolving                                     host=quay.io
DEBU[0000] do request                                    host=quay.io request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://quay.io/v2/openshift-qe-optional-operators/ocp4-index/manifests/latest"
DEBU[0001] fetch response received                       host=quay.io response.header.content-length=112 response.header.content-type=application/json response.header.date="Thu, 06 May 2021 07:01:14 GMT" response.header.docker-distribution-api-version=registry/2.0 response.header.server=nginx/1.12.1 response.header.www-authenticate="Bearer realm=\"https://quay.io/v2/auth\",service=\"quay.io\",scope=\"repository:openshift-qe-optional-operators/ocp4-index:pull\"" response.status="401 Unauthorized" url="https://quay.io/v2/openshift-qe-optional-operators/ocp4-index/manifests/latest"
DEBU[0001] Unauthorized                                  header="Bearer realm=\"https://quay.io/v2/auth\",service=\"quay.io\",scope=\"repository:openshift-qe-optional-operators/ocp4-index:pull\"" host=quay.io
DEBU[0001] do request                                    host=quay.io request.header.accept="application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, */*" request.header.user-agent=containerd/1.5.0-rc.1+unknown request.method=HEAD url="https://quay.io/v2/openshift-qe-optional-operators/ocp4-index/manifests/latest"
DEBU[0002] fetch response received                       host=quay.io response.header.content-length=6727 response.header.content-type=application/vnd.docker.distribution.manifest.v1+prettyjws response.header.date="Thu, 06 May 2021 07:01:15 GMT" response.header.docker-content-digest="sha256:714442dba57d29425d3d92e6e0044dc5fcffabaeea6e0ac54bf5c98a2d2b8c99" response.header.server=nginx/1.12.1 response.header.strict-transport-security="max-age=63072000; preload" response.header.x-frame-options=DENY response.status="200 OK" url="https://quay.io/v2/openshift-qe-optional-operators/ocp4-index/manifests/latest"
DEBU[0002] resolved                                      desc.digest="sha256:714442dba57d29425d3d92e6e0044dc5fcffabaeea6e0ac54bf5c98a2d2b8c99" host=quay.io
ERRO[0002] application/vnd.docker.distribution.manifest.v1+prettyjws not supported 
ERRO[0002] Unknown descriptor type:      

Can local tarballs be used for push?

Hello,
I would like to use manifest-tool to build a multi-arch image from two tarballs that i have only locally.
Is this possible? It would be great if I don't need to push them first to "merge" them. I didn't find any documentation on that. Usecase would be CICD for this.
e.g

image: myprivreg:5000/someimage:latest
manifests:
  -
    image: dir:localarmimage
    platform:
      architecture: arm64
      os: linux
 -
    image: dir:localamdimage
    platform:
      architecture: amd64
      os: linux

Thank you in advance!
Greetings Basti

[Bug] Need to supply username and password despite logging in

Git version: 856eb8c (i.e checked out master a couple days ago)
Go version: go1.13.7 darwin/amd64

I was experimenting with pushing manifests to private registry. I logged into it with docker login, push some images, but then when I tried to push the manifest, I got:

FATA[0001] Inspect of image "<image name>" failed with error: errors:
denied: requested access to the resource is denied
unauthorized: authentication required

I repeated the push with --username and --password and it succeeded.

I have credentials in $HOME/.docker/plaintext-passwords.json, and my $HOME/.docker/config.json looks like this:

{
  "auths": {
    "<private registry URL>": {},
    "https://index.docker.io/v1/": {}
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/19.03.8 (darwin)"
  },
  "credsStore": "desktop",
  "experimental": "enabled",
  "stackOrchestrator": "swarm"
}

Let me know if I can give you any more information.

Retagging existing manifest lists

In #31 (comment) and #32 (comment) there was discussion of possible remote tagging capabilities in either manifest-tool or docker manifest, but I can't find any results.

My goal: Take an existing multi-arch tag (from docker buildx) and apply a new tag to it, without rebuilding the image. This is being done in CI, so the machine re-tagging must get any source data from Docker Hub.

Trying to use manifest-tool as-is results in You specified a manifest list entry from a digest that points to a current manifest list. Manifest lists do not allow recursion for me either using a YAML template or something like manifest-tool push from-args --platforms linux/arm/v7,linux/arm/v6,linux/arm64,linux/amd64 --template repo/image:testing --target repo/image:latest.

Reading the docs for docker manifest doesn't seem to have anything matching this use-case.

Can anyone point me in the right direction, or is this still "not yet"?

Fill out description fields in registry?

The Docker registry has some descriptive fields in it that allow the developer to (somehow) give some text description to the image.

If you upload to Docker hub with this tool, those fields are blank, cf. https://hub.docker.com/r/vielmetti/multiarch-gitea/

It would be a welcome extension to manifest-tool to support updating those fields. (Or, if that's out of scope for this tool because of lack of registry standardization, a pointer to a tool that would do that task welcomed.) I see docker-archive/docker-registry#561 as one possible non-API answer to this task.

Requesting release 1.0.2

I've tested #84 end to end by creating a custom manifest plugin to drone and we've integrated it into our CI. At your convenience could you please release manifest-tool so that the drone manifest plugin could pick it up.

Build a multi-arch image of manifest-tool

I think you should build docker images for each architecture you build the tool for and publish to estesp/manifest-tool and use manifest-tool to publish the manifest on the tag at release time.

You would be using your own tool and it would make the official image of your tool available for use in container based CI/CD systems like Drone, GitLab CI, etc ...

Pushing to "library/xxx" fails

Pushing to library/xxx ends up creating URLs referencing only xxx, which then fails.

The issue appears to be in the current copy of the upstream github.com/docker/distribution / github.com/docker/docker code, but it's not clear whether updating those would solve the problem (and the update is non-trivial to perform).

A full log of a failed push can be found at: https://gist.github.com/anonymous/20846e9e9aa995ddf2a6cfe72e1a4a42

(Note bits like DEBU[0018] Manifest list push url: https://registry-1.docker.io/v2/irssi/manifests/latest, which should be https://registry-1.docker.io/v2/library/irssi/manifests/latest instead, etc.)

The associated YAML file:

---
image: library/irssi:latest
manifests:
  - image: amd64/irssi:latest
    platform:
      os: linux
      architecture: amd64
  - image: arm32v5/irssi:latest
    platform:
      os: linux
      architecture: arm
      variant: v5
  - image: arm32v7/irssi:latest
    platform:
      os: linux
      architecture: arm
      variant: v7
  - image: arm64v8/irssi:latest
    platform:
      os: linux
      architecture: arm64
      variant: v8
  - image: i386/irssi:latest
    platform:
      os: linux
      architecture: 386
  - image: ppc64le/irssi:latest
    platform:
      os: linux
      architecture: ppc64le
  - image: s390x/irssi:latest
    platform:
      os: linux
      architecture: s390x

We've managed to verify our assumptions with the following patch which simply forces the upstream code to use library/xxx for official images (which we're likely going to apply locally for continuing our builds while a proper fix to this problem is found), but this isn't a great long-term solution since it modifies code in vendor/ (and we cannot see a simple solution to this which doesn't do so):

diff --git a/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/distribution/reference/reference.go
index 52da523..3cf3d98 100644
--- a/vendor/github.com/docker/distribution/reference/reference.go
+++ b/vendor/github.com/docker/distribution/reference/reference.go
@@ -100,6 +100,13 @@ func (f *Field) UnmarshalText(p []byte) error {
 	return nil
 }
 
+func remoteName(name string) string {
+	if !strings.ContainsRune(name, '/') {
+		return "library/" + name
+	}
+	return name
+}
+
 // Named is an object with a full name
 type Named interface {
 	Reference
@@ -304,7 +311,7 @@ func (r reference) String() string {
 }
 
 func (r reference) Name() string {
-	return r.name
+	return remoteName(r.name)
 }
 
 func (r reference) Tag() string {
@@ -322,7 +329,7 @@ func (r repository) String() string {
 }
 
 func (r repository) Name() string {
-	return string(r)
+	return remoteName(string(r))
 }
 
 type digestReference digest.Digest
@@ -345,7 +352,7 @@ func (t taggedReference) String() string {
 }
 
 func (t taggedReference) Name() string {
-	return t.name
+	return remoteName(t.name)
 }
 
 func (t taggedReference) Tag() string {
@@ -362,7 +369,7 @@ func (c canonicalReference) String() string {
 }
 
 func (c canonicalReference) Name() string {
-	return c.name
+	return remoteName(c.name)
 }
 
 func (c canonicalReference) Digest() digest.Digest {

Errors will happen when upgrading the library

(The purpose of this report is to alert estesp/manifest-tool to the possible problems when estesp/manifest-tool try to upgrade the following dependencies)

An error will happen when upgrading library github.com/codegangsta/cli:

github.com/codegangsta/cli

-Now Moved To: github.com/urfave/cli
-Latest Version: v2.2.0 (Latest commit d648edd on 6 Mar)
-Where did you use it:
https://github.com/estesp/manifest-tool/search?q=github.com%2Fcodegangsta%2Fcli&unscoped_q=github.com%2Fcodegangsta%2Fcli
-Detail:

github.com/urfave/cli/go.mod

module github.com/urfave/cli/v2
go 1.11
require (
	github.com/BurntSushi/toml v0.3.1
	github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
	gopkg.in/yaml.v2 v2.2.2
) 

github.com/urfave/cli/docs.go

package cli
import (
	"github.com/cpuguy83/go-md2man/v2/md2man"
	…
) 

This problem was introduced since urfave/cli v1.22.1 . If you try to upgrade urfave/cli to version ** v1.22.1** and above, you will get an error--- no package exists at "github.com/cpuguy83/go-md2man/v2/md2man"

NOTICE HERE The github.com/codegangsta/cli makes it very difficult for downstream module users to use estesp/manifest-tool:#94
Force downstream module users to use vendor if they want to use estesp/manifest-tool.

I investigated the libraries (urfave/cli >= v1.22.1) release information and found the root cause of this issue is that----

  1. These dependencies all added Go modules in the recent versions.

  2. They all comply with the specification of "Releasing Modules for v2 or higher" available in the Modules documentation. Quoting the specification:

A package that has migrated to Go Modules must include the major version in the import path to reference any v2+ modules. For example, Repo github.com/my/module migrated to Modules on version v3.x.y. Then this repo should declare its module path with MAJOR version suffix "/v3" (e.g., module github.com/my/module/v3), and its downstream project should use "github.com/my/module/v3/mypkg" to import this repo’s package.

  1. This "github.com/my/module/v3/mypkg" is not the physical path. So earlier versions of Go (including those that don't have minimal module awareness) plus all tooling (like dep, glide, govendor, etc) don't have minimal module awareness as of now and therefore don't handle import paths correctly See golang/dep#1962, golang/dep#2139.

Note: creating a new branch is not required. If instead you have been previously releasing on master and would prefer to tag v3.0.0 on master, that is a viable option. (However, be aware that introducing an incompatible API change in master can cause issues for non-modules users who issue a go get -u given the go tool is not aware of semver prior to Go 1.11 or when module mode is not enabled in Go 1.11+).
Pre-existing dependency management solutions such as dep currently can have problems consuming a v2+ module created in this way. See for example dep#1962.
https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher

Solution

1. Migrate to Go Modules.

Go Modules is the general trend of ecosystem, if you want a better upgrade package experience, migrating to Go Modules is a good choice.

Migrate to modules will be accompanied by the introduction of virtual paths(It was discussed above).

This "github.com/my/module/v3/mypkg" is not the physical path. So Go versions older than 1.9.7 and 1.10.3 plus all third-party dependency management tools (like dep, glide, govendor, etc) don't have minimal module awareness as of now and therefore don't handle import paths correctly.

Then the downstream projects might be negatively affected in their building if they are module-unaware (Go versions older than 1.9.7 and 1.10.3; Or use third-party dependency management tools, such as: Dep, glide, govendor…).

[*] You can see who will be affected here: [3 module-unaware users, i.e., chuanshanjun/fabric, yz1019117968/blockchain, linuxkit/linuxkit]
https://github.com/search?q=estesp%2Fmanifest-tool+filename%3Avendor.conf+filename%3Avendor.json+filename%3Aglide.toml+filename%3AGodep.toml+filename%3AGodep.json

2. Maintaining v2+ libraries that use Go Modules in Vendor directories.

If estesp/manifest-tool want to keep using the dependency manage tools (like dep, glide, govendor, etc), and still want to upgrade the dependencies, can choose this fix strategy.
Manually download the dependencies into the vendor directory and do compatibility dispose(materialize the virtual path or delete the virtual part of the path). Avoid fetching the dependencies by virtual import paths. This may add some maintenance overhead compared to using modules.

There is 1 module user downstream, such as arangodb-helper/arangodb-exporter…)
https://github.com/search?q=estesp%2Fmanifest-tool+filename%3Ago.mod

As the import paths have different meanings between the projects adopting module repos and the non-module repos, materialize the virtual path is a better way to solve the issue, while ensuring compatibility with downstream module users. A textbook example provided by repo github.com/moby/moby is here:
https://github.com/moby/moby/blob/master/VENDORING.md
https://github.com/moby/moby/blob/master/vendor.conf
In the vendor directory, github.com/moby/moby adds the /vN subdirectory in the corresponding dependencies.
This will help more downstream module users to work well with your package.

3. Request upstream to do compatibility processing.

The codegangsta/cli have 225 module-unaware users in github, such as: FINTLabs/fint-oauth-token, rancher/share-mnt, wushuai826/wushuai…
https://github.com/search?q=codegangsta%2Fcli+filename%3Avendor.conf+filename%3Avendor.json+filename%3Aglide.toml+filename%3AGodep.toml+filename%3AGodep.json

Summary

You can make a choice when you meet this DM issues by balancing your own development schedules/mode against the affects on the downstream projects.

For this issue, Solution 1 can maximize your benefits and with minimal impacts to your downstream projects the ecosystem.

References

Do you plan to upgrade the libraries in near future?
Hope this issue report can help you ^_^
Thank you very much for your attention.

Best regards,
Kate

Error from manifest-tool against GCR

This seems new, so possibly something changed in GCR, but I am not sure where to look. @mattmoor too ?

$ manifest-tool inspect staging-k8s.gcr.io/coredns:1.2.4__amd64_linux
FATA[0000] unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication 

vs

$ docker inspect staging-k8s.gcr.io/coredns:1.2.4__amd64_linux
[
    {
        "Id": "sha256:d35fe8670379d749764757bc2ea43f7f7dac013ee04a2440be8607dadc8e83dd",
        "RepoTags": [
            "staging-k8s.gcr.io/coredns:1.2.4__amd64_linux"
        ],
        "RepoDigests": [
...

Can you lend me a clue?

manifest not found

When I use manifest-tool to make multiarch image,it seems that I pushed the multiarch image successfully.The amd64 ppc64le s390x images are sepreated build on amd64 ppc64le s390x hosts.
However when I pull the multiarch image it said that manifest not found

# ./manifest-tool --debug push from-args --platforms linux/amd64,linux/ppc64le,linux/s390x --template hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-ARCH:9f6e8142 --target hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend:1.5.5
DEBU[0000] hostDir: /etc/docker/certs.d/hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com
DEBU[0000] hostDir: /etc/docker/certs.d/hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com
DEBU[0000] endpoints: [{false https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2 false false true 0xc00008d980} {false https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v1 false false true 0xc00008de00}]
DEBU[0000] repoName: ibmcom/default-http-backend
INFO[0000] Retrieving digests of images...
DEBU[0000] authConfig for hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com: [email protected]
DEBU[0000] hostDir: /etc/docker/certs.d/hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com
DEBU[0000] endpoints: [{false https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2 false false true 0xc00037e900}]
DEBU[0000] Trying to fetch image manifest of hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-amd64 repository from https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2
INFO[0001] Image "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-amd64:9f6e8142" is digest sha256:866fef14808bb891558e22258c9ae28b4e9b6f5c67f601850eadca27831e39c4; size: 1367
DEBU[0001] Adding manifest references of "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-amd64:9f6e8142" to blob mount requests
DEBU[0001] Adding manifest "ibmcom/default-http-backend-amd64" -> to be pushed to "ibmcom/default-http-backend" as a manifest reference
DEBU[0001] authConfig for hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com: [email protected]
DEBU[0001] hostDir: /etc/docker/certs.d/hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com
DEBU[0001] endpoints: [{false https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2 false false true 0xc00037e180}]
DEBU[0001] Trying to fetch image manifest of hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-ppc64le repository from https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2
INFO[0002] Image "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-ppc64le:9f6e8142" is digest sha256:bfaf756f81cd5b79d640035b86702a1a64023974f8ef9b672cc183241622d5f8; size: 1366
DEBU[0002] Adding manifest references of "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-ppc64le:9f6e8142" to blob mount requests
DEBU[0002] Adding manifest "ibmcom/default-http-backend-ppc64le" -> to be pushed to "ibmcom/default-http-backend" as a manifest reference
DEBU[0002] authConfig for hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com: [email protected]
DEBU[0002] hostDir: /etc/docker/certs.d/hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com
DEBU[0002] endpoints: [{false https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2 false false true 0xc0001fe000}]
DEBU[0002] Trying to fetch image manifest of hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-s390x repository from https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com v2
INFO[0003] Image "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-s390x:9f6e8142" is digest sha256:6627dc2f9d8ce24ee98f9daa79bd3671b8293039f5a3aa153c50f8e4e1d7a9b9; size: 1367
DEBU[0003] Adding manifest references of "hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend-s390x:9f6e8142" to blob mount requests
DEBU[0003] Adding manifest "ibmcom/default-http-backend-s390x" -> to be pushed to "ibmcom/default-http-backend" as a manifest reference
DEBU[0003] Manifest list push url: https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/manifests/1.5.5
DEBU[0003] mediaType of manifestList: application/vnd.docker.distribution.manifest.list.v2+json
DEBU[0003] authConfig for hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com: [email protected]
DEBU[0003] Mount of blob sha256:2fe9b4c1de865b4d3dfa965d999ebb5d4689502ef19b00d9e137fbaebe00a644 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:2fe9b4c1de865b4d3dfa965d999ebb5d4689502ef19b00d9e137fbaebe00a644"
DEBU[0004] Mount of blob sha256:2b10c4b8508af0e225b15e79b61c88e9e5cd79e66f1ddc3fdb2f0f4dc868e03d succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:2b10c4b8508af0e225b15e79b61c88e9e5cd79e66f1ddc3fdb2f0f4dc868e03d"
DEBU[0004] Mount of blob sha256:1fe78366afe1982768d9111afc89cb9a0413b72e73490aaccb83407ff0c90885 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:1fe78366afe1982768d9111afc89cb9a0413b72e73490aaccb83407ff0c90885"
DEBU[0005] Mount of blob sha256:26f3a5a82e5e087bf9101c9bb751cd47cc5dc1d100ceb17cce0535ae2d9b0778 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:26f3a5a82e5e087bf9101c9bb751cd47cc5dc1d100ceb17cce0535ae2d9b0778"
DEBU[0005] Mount of blob sha256:65f4220de95d2e3d12484679abe7bb33323b1fd3ef681d878f1d2bc5abc8ee06 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:65f4220de95d2e3d12484679abe7bb33323b1fd3ef681d878f1d2bc5abc8ee06"
DEBU[0005] Mount of blob sha256:1b6b3e582ee1c1a1d12ba34d787725667930dd5176803177ac415eec94907f60 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:1b6b3e582ee1c1a1d12ba34d787725667930dd5176803177ac415eec94907f60"
DEBU[0006] Mount of blob sha256:7175e61baa4249ac1fcba318f93f4ddad71a0191214cf2159c45b45d3701e61d succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:7175e61baa4249ac1fcba318f93f4ddad71a0191214cf2159c45b45d3701e61d"
DEBU[0006] Mount of blob sha256:7da67a5b6b815a5368554a138f6f5f1e3357be75679def8d26d5d6b6675a3040 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:7da67a5b6b815a5368554a138f6f5f1e3357be75679def8d26d5d6b6675a3040"
DEBU[0007] Mount of blob sha256:2f6a48a36dfe338b398dfca711ab0fe04e8076726f45e80670958ea648537694 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:2f6a48a36dfe338b398dfca711ab0fe04e8076726f45e80670958ea648537694"
DEBU[0007] Mount of blob sha256:4424ea390716863039dced4e52608a3ec1772fe0bba3357b154eaca2ccdcab63 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:4424ea390716863039dced4e52608a3ec1772fe0bba3357b154eaca2ccdcab63"
DEBU[0007] Mount of blob sha256:990385730fa22245914b6dfc1d23b3513791739a5e950baf62da4dfcf9fbad0e succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:990385730fa22245914b6dfc1d23b3513791739a5e950baf62da4dfcf9fbad0e"
DEBU[0008] Mount of blob sha256:b5ab08fe49e0e8203ceeaa55972fa7850b1dddd0413f52341a6aac1d775a1313 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:b5ab08fe49e0e8203ceeaa55972fa7850b1dddd0413f52341a6aac1d775a1313"
DEBU[0008] Mount of blob sha256:0447292f2feecf9ee200b953d5db2fddf0100641aa545439f418afa824e84a98 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:0447292f2feecf9ee200b953d5db2fddf0100641aa545439f418afa824e84a98"
DEBU[0009] Mount of blob sha256:5a2b90eab4de33f4807b49e2a184560d466c4286df24ce9635c03f31929f2d1e succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:5a2b90eab4de33f4807b49e2a184560d466c4286df24ce9635c03f31929f2d1e"
DEBU[0009] Mount of blob sha256:4d868dd29b253f1861cba9cfd120f4466164569160804d82453baf0139fc65b5 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:4d868dd29b253f1861cba9cfd120f4466164569160804d82453baf0139fc65b5"
DEBU[0010] Mount of blob sha256:461ddc94270c8356155657924e1488c8d3f2b33590e3117463ef53b833245f3e succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:461ddc94270c8356155657924e1488c8d3f2b33590e3117463ef53b833245f3e"
DEBU[0010] Mount of blob sha256:6854f645886944fc331e0d2f56e419964cafd2a36d7acecd94cebea73c66ae85 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:6854f645886944fc331e0d2f56e419964cafd2a36d7acecd94cebea73c66ae85"
DEBU[0010] Mount of blob sha256:dec0d00edb466b1cf3816e998913fe415c763afee849a2c99ce88066bdff1170 succeeded, location: "https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/blobs/sha256:dec0d00edb466b1cf3816e998913fe415c763afee849a2c99ce88066bdff1170"
DEBU[0010] manifest reference push URL: https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/manifests/1.5.5
DEBU[0012] referenced manifest "ibmcom/default-http-backend-amd64" pushed; digest matches: sha256:866fef14808bb891558e22258c9ae28b4e9b6f5c67f601850eadca27831e39c4
DEBU[0012] manifest reference push URL: https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/manifests/1.5.5
DEBU[0013] referenced manifest "ibmcom/default-http-backend-ppc64le" pushed; digest matches: sha256:bfaf756f81cd5b79d640035b86702a1a64023974f8ef9b672cc183241622d5f8
DEBU[0013] manifest reference push URL: https://hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/v2/ibmcom/default-http-backend/manifests/1.5.5
DEBU[0014] referenced manifest "ibmcom/default-http-backend-s390x" pushed; digest matches: sha256:6627dc2f9d8ce24ee98f9daa79bd3671b8293039f5a3aa153c50f8e4e1d7a9b9
Digest: sha256:77a6a492b57272e8818cd3a300cc40d24c1d87c20275940e7a76101c806d7315 1054
# docker pull hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend:1.5.5
1.5.5: Pulling from ibmcom/default-http-backend
manifest for hyc-cloud-private-integration-docker-local.artifactory.swg-devops.com/ibmcom/default-http-backend:1.5.5 not found

I don't know why it is not found.Can some one take a look at this problem?Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.