push access denied, repository does not exist or may require authorization: server message:
insufficient_scope: authorization failed — Docker Hub refused the push because the first
part of the image name is not an account you can write to. Log in with docker login,
tag the image as <your-docker-id>/<repo>, and push that name.
Many answers quote this refusal as denied: requested access to the resource is
denied. Docker Desktop 4.96 with its containerd image store printed the longer line above
instead, so search for both.
The error
PS> docker tag alpine fix6example/hello:1
PS> docker push fix6example/hello:1
The push refers to repository [docker.io/fix6example/hello]
e2de96513ba9: Unavailable
push access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Exit code 1. The output went to a pipe, so the Unavailable line was printed again on
every progress update, several dozen identical lines in all; they are shown once here.
Why it happens
The image name is the destination. With no registry host in front, Docker expands
fix6example/hello to docker.io/fix6example/hello, which is exactly what
the first line of the output says. On Docker Hub, the part before the slash is a namespace: a user
or an organisation. You can push only into a namespace your login belongs to, and this push
carried no login at all, so Docker Hub granted it no push rights; that is what
insufficient_scope means.
The message offers two explanations, a repository that does not exist and one that needs
authorization, because the registry does not tell an outsider which it is. The usual causes are
a missing docker login, an image still tagged with a project name instead of your
Docker ID, or a tutorial's example name copied as is.
The fix
This test did not sign in to Docker Hub, so the route is described here, not shown as a run:
sign in with docker login, tag the image with docker tag under your own
namespace, <your-docker-id>/hello:1, where the first part is your Docker ID or an
organisation you belong to, and push that name. Then remove the wrong name. This part was run:
PS> docker rmi fix6example/hello:1
Untagged: fix6example/hello:1
PS> docker images --filter reference=fix6example/hello --filter reference=alpine
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
alpine:latest 294b683cb724 13MB 3.94MB
A tag is another name for the same image, which is why both names had the ID
294b683cb724 before the clean-up. Removing the wrong name printed only
Untagged, and alpine stayed. For other registries, the host goes at the
front of the name: ghcr.io/<owner>/hello:1 for GitHub Container Registry after
docker login ghcr.io, or <name>.azurecr.io/hello:1 for an Azure
Container Registry after signing in to it.
How it was reproduced
Docker Desktop 4.96.3 with client and engine 29.9.2 and the containerd image store
(docker info reports io.containerd.snapshotter.v1), from Windows
PowerShell 5.1, using the cached alpine:latest image. The Docker CLI ran with an empty
configuration folder (DOCKER_CONFIG), so no stored login could be sent, and the push
was attempted once. fix6example is the test's own name, not an account of this site.
Frequently asked
- What does 'push access denied, repository does not exist or may require authorization' mean?
- Docker Hub refused the push. The namespace at the start of the image name is not one you can write to, usually because you are not logged in or the name does not start with your Docker ID.
- How do I push an image to my own Docker Hub account?
- Run docker login, tag the image as your-docker-id/repository:tag with docker tag, and push that name. The part before the slash must be your Docker ID or an organisation you can push to.
- Does docker rmi on a tag delete the original image?
- No. A tag is another name for the same image. Removing the extra tag printed only Untagged, and the original alpine image stayed with the same ID.
More decoded errors in the Fixes category. The same refusal on the way in, when Docker cannot pull an image: pull access denied, repository does not exist.