Fixes https://github.com/docker/build-push-action/issues/892 Related to https://github.com/docker/build-push-action/issues/321 Signed-off-by: Nicolas Vuillamy <nicolas.vuillamy@gmail.com>
		
			
				
	
	
		
			165 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Troubleshooting
 | 
						|
 | 
						|
* [Cannot push to a registry](#cannot-push-to-a-registry)
 | 
						|
  * [BuildKit container logs](#buildkit-container-logs)
 | 
						|
  * [With containerd](#with-containerd)
 | 
						|
* [`repository name must be lowercase`](#repository-name-must-be-lowercase)
 | 
						|
* [Image not loaded](#image-not-loaded)
 | 
						|
 | 
						|
## Cannot push to a registry
 | 
						|
 | 
						|
While pushing to a registry, you may encounter these kinds of issues:
 | 
						|
 | 
						|
* `failed commit on ref "layer-sha256:...": invalid content digest in response: invalid checksum digest format`
 | 
						|
* `failed commit on ref "layer-sha256:...": no response`
 | 
						|
* `failed commit on ref "manifest-sha256:...": unexpected status: 400 Bad Request`
 | 
						|
* `failed commit on ref "manifest-sha256:...": unexpected status: 401 Unauthorized`
 | 
						|
* `unexpected response: 401 Unauthorized`
 | 
						|
 | 
						|
These issues are not directly related to this action but are rather linked to
 | 
						|
[Buildx](https://github.com/docker/buildx), [BuildKit](https://github.com/moby/buildkit),
 | 
						|
[containerd](https://github.com/containerd/containerd) or the registry on which
 | 
						|
you're pushing your image. The quality of error message depends on the registry
 | 
						|
and are usually not very informative.
 | 
						|
 | 
						|
### BuildKit container logs
 | 
						|
 | 
						|
To help you solve this, you have to [enable debugging in the setup-buildx](https://github.com/docker/setup-buildx-action#buildkit-container-logs)
 | 
						|
action step and attach BuildKit container logs to your issue.
 | 
						|
 | 
						|
### With containerd
 | 
						|
 | 
						|
Next you can test pushing with [containerd action](https://github.com/crazy-max/ghaction-setup-containerd)
 | 
						|
using the following workflow. If it works then open an issue on [BuildKit](https://github.com/moby/buildkit)
 | 
						|
repository.
 | 
						|
 | 
						|
```yaml
 | 
						|
name: containerd
 | 
						|
 | 
						|
on:
 | 
						|
  push:
 | 
						|
 | 
						|
jobs:
 | 
						|
  containerd:
 | 
						|
    runs-on: ubuntu-latest
 | 
						|
    steps:
 | 
						|
      -
 | 
						|
        name: Checkout
 | 
						|
        uses: actions/checkout@v3
 | 
						|
      -
 | 
						|
        name: Set up QEMU
 | 
						|
        uses: docker/setup-qemu-action@v2
 | 
						|
      -
 | 
						|
        name: Set up Docker Buildx
 | 
						|
        uses: docker/setup-buildx-action@v2
 | 
						|
        with:
 | 
						|
          buildkitd-flags: --debug
 | 
						|
      -
 | 
						|
        name: Set up containerd
 | 
						|
        uses: crazy-max/ghaction-setup-containerd@v2
 | 
						|
      -
 | 
						|
        name: Build Docker image
 | 
						|
        uses: docker/build-push-action@v4
 | 
						|
        with:
 | 
						|
          context: .
 | 
						|
          platforms: linux/amd64,linux/arm64
 | 
						|
          tags: docker.io/user/app:latest
 | 
						|
          outputs: type=oci,dest=/tmp/image.tar
 | 
						|
      -
 | 
						|
        name: Import image in containerd
 | 
						|
        run: |
 | 
						|
          sudo ctr i import --base-name docker.io/user/app --digests --all-platforms /tmp/image.tar
 | 
						|
      -
 | 
						|
        name: Push image with containerd
 | 
						|
        run: |
 | 
						|
          sudo ctr --debug i push --user "${{ secrets.DOCKER_USERNAME }}:${{ secrets.DOCKER_PASSWORD }}" docker.io/user/app:latest
 | 
						|
```
 | 
						|
 | 
						|
## `repository name must be lowercase`
 | 
						|
 | 
						|
You may encounter this issue if you're using `github.repository` as a repo slug
 | 
						|
in your tag:
 | 
						|
 | 
						|
```
 | 
						|
#6 exporting to image
 | 
						|
#6 exporting layers
 | 
						|
#6 exporting layers 1.2s done
 | 
						|
#6 exporting manifest sha256:b47f7dfb97b89ccd5de553af3c8cd94c4795884cbe5693e93946b1d95a7b1d12 0.0s done
 | 
						|
#6 exporting config sha256:995e93fab8196893192f08a38deea6769dc4d98f86cf705eccc24ec96a3e271c 0.0s done
 | 
						|
#6 ERROR: invalid reference format: repository name must be lowercase
 | 
						|
------
 | 
						|
 > exporting to image:
 | 
						|
------
 | 
						|
error: failed to solve: invalid reference format: repository name must be lowercase
 | 
						|
```
 | 
						|
 | 
						|
or a cache reference:
 | 
						|
 | 
						|
```
 | 
						|
#10 importing cache manifest from ghcr.io/My-Org/repo:main
 | 
						|
#10 ERROR: invalid reference format: repository name must be lowercase
 | 
						|
```
 | 
						|
 | 
						|
To fix this issue you can use our [metadata action](https://github.com/docker/metadata-action)
 | 
						|
to generate sanitized tags:
 | 
						|
 | 
						|
```yaml
 | 
						|
- name: Docker meta
 | 
						|
  id: meta
 | 
						|
  uses: docker/metadata-action@v4
 | 
						|
  with:
 | 
						|
    images: ghcr.io/${{ github.repository }}
 | 
						|
    tags: latest
 | 
						|
 | 
						|
- name: Build and push
 | 
						|
  uses: docker/build-push-action@v4
 | 
						|
  with:
 | 
						|
    context: .
 | 
						|
    push: true
 | 
						|
    tags: ${{ steps.meta.outputs.tags }}
 | 
						|
```
 | 
						|
 | 
						|
Or a dedicated step to sanitize the slug:
 | 
						|
 | 
						|
```yaml
 | 
						|
- name: Sanitize repo slug
 | 
						|
  uses: actions/github-script@v6
 | 
						|
  id: repo_slug
 | 
						|
  with:
 | 
						|
    result-encoding: string
 | 
						|
    script: return 'ghcr.io/${{ github.repository }}'.toLowerCase()
 | 
						|
 | 
						|
- name: Build and push
 | 
						|
  uses: docker/build-push-action@v4
 | 
						|
  with:
 | 
						|
    context: .
 | 
						|
    push: true
 | 
						|
    tags: ${{ steps.repo_slug.outputs.result }}:latest
 | 
						|
```
 | 
						|
 | 
						|
## Image not loaded
 | 
						|
 | 
						|
Sometimes when your workflows are heavy consumers of disk storage, it can happen that build-push-action declares that the built image is loaded, but then not found in the following workflow steps.
 | 
						|
 | 
						|
- You can use the following solution as workaround, to free space on disk before building docker image using the following workflow step
 | 
						|
 | 
						|
```yaml
 | 
						|
      # Free disk space
 | 
						|
      - name: Free Disk space
 | 
						|
        shell: bash
 | 
						|
        run: |
 | 
						|
          sudo rm -rf /usr/local/lib/android  # will release about 10 GB if you don't need Android
 | 
						|
          sudo rm -rf /usr/share/dotnet # will release about 20GB if you don't need .NET
 | 
						|
```
 | 
						|
 | 
						|
- Another workaround can be to call `docker/setup-buildx-action` with docker driver
 | 
						|
 | 
						|
```yaml
 | 
						|
name: Set up Docker Buildx
 | 
						|
uses: docker/setup-buildx-action@v2
 | 
						|
with:
 | 
						|
  driver: docker
 | 
						|
```
 | 
						|
 | 
						|
More details in the [related issue](https://github.com/docker/build-push-action/issues/321)
 |