docker / build-push-action

GitHub Action to build and push Docker images with Buildx
https://github.com/marketplace/actions/build-and-push-docker-images
Apache License 2.0
4.31k stars 552 forks source link

Ability to use multiple names when using output `type=image` #1072

Closed alessfg closed 6 months ago

alessfg commented 7 months ago

Description

Hello! Not entirely sure if this is a bug or a missing functionality, but tl;dr -- I can't seem to figure out how to use multiple names when using output type=image and thus push the image to multiple registries (you can find the original PR here https://github.com/nginxinc/docker-nginx-unprivileged/pull/195). The docs mention that when using the buildx CLI, you can wrap the list of names in double quotes, but no matter what I try, this action seems to fail. I've tested all combinations of escape sequences too to no avail ("",\",\\"). I've also opened up a discussion which includes a bit more information (https://github.com/docker/build-push-action/discussions/1067). Finally, here's a sample code block of one of the things I've tried:

- name: Build and push image to Docker Hub and GitHub Container Registry
  id: build
  uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0
  with:
    platforms: ${{ matrix.platform }}
    context: "."
    labels: ${{ steps.meta.outputs.labels }}
    outputs: type=image,name=\"ghcr.io/nginxinc/nginx-unprivileged,docker.io/nginxinc/nginx-unprivileged\",push-by-digest=true,name-canonical=true,push=true

Let me know if you need any more information!

crazy-max commented 7 months ago

I repro as well with:

image

Do you have the same error?

alessfg commented 7 months ago

Yep! That's one of the errors I'm seeing. The actual error depends on the "format" I try but they all follow the same style.

crazy-max commented 7 months ago

Ok so this error https://github.com/docker/build-push-action/issues/1072#issuecomment-1979174962 is related to csv parsing in build command (buildx) which make sense because quotes should take the whole column. Correct syntax is:

type=image,"name=ghcr.io/nginxinc/nginx-unprivileged,docker.io/nginxinc/nginx-unprivileged",push-by-digest=true,name-canonical=true,push=true

But still fails with:

Error: buildx failed with: ERROR: invalid value docker.io/nginxinc/nginx-unprivileged

I think this is related to the csv-parse lib that we are using in our actions toolkit: https://github.com/docker/actions-toolkit/blob/7fb507050a318dff09c0e4dd89c14a569fc62548/src/util.ts#L40 that is stripping the quotes where it should not:

/usr/bin/docker buildx build --file ./Dockerfile --iidfile /home/runner/work/_temp/docker-actions-toolkit-8En3Bu/iidfile --output type=image,name=ghcr.io/nginxinc/nginx-unprivileged,docker.io/nginxinc/nginx-unprivileged,push-by-digest=true,name-canonical=true,push=true ...

So might need changes in actions-toolkit. Still digging.

crazy-max commented 7 months ago

Ok after tests in https://github.com/docker/actions-toolkit/pull/273, we need to keep quotes around fields for this input by setting quote to false: https://csv.js.org/parse/options/quote/