Pull Docker Images by Tag, Digest or Platform
A tag is a name, and names can move, so the image you pull today may not be the image you pull next month. This guide shows how to run docker pull for one image, confirm what landed locally, and choose between a moving tag and an immutable digest. The examples match Docker Community Edition CLI 29.8.1, installed here as package docker-ce-cli 5:29.8.1-1~ubuntu.24.04~noble.
The route
Jump straight to the step you need, or tick off Done means at the end.
Allow about ten minutes for one image, plus download time.
- You need: the Docker CLI, a running Docker daemon, network access to the registry, and permission for your account to use that daemon.
- Check access before sudo. The pull itself is not a system-file operation, but a Docker installation may require membership of its configured access group or an explicitly elevated invocation.
1. Check the installed command
Start with read-only checks. They do not download anything and normally need no elevated privileges:
$ docker --version
Docker version 29.8.1, build 4a63305
$ docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
The installed manual describes docker pull as an alias for docker image pull. The name must identify an image repository and may include a tag or digest. The options available on this installation are --all-tags, --platform and --quiet.
Checkpoint
If docker --version works but a later pull says it cannot connect to the daemon, fix the daemon or account access first. Do not treat sudo as a general-purpose repair for a stopped service or an unavailable registry.
2. Pull one tagged image
For a small, familiar smoke test, pull Docker's hello-world image:
$ docker pull hello-world:latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
Layer identifiers, digest and status vary. If you supply no tag, Docker uses latest, so write the tag explicitly to make that default visible in scripts and review. A later pull may say the image is already up to date instead of downloading layers again.
Warning
This changes the local image store and uses disk space, though it does not start a container. Nothing gives you the network traffic back. If you no longer want the image, inspect it first and remove it deliberately with docker image rm IMAGE. Removal can fail, or affect other local tags, when the image is still referenced.
3. Verify the local image
Use the image listing as a quick checkpoint. The filter keeps unrelated local images out of the result:
$ docker image ls --filter reference='hello-world:latest'
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest ... ... ...
Your image ID, creation time and size will differ. A row for the requested repository and tag confirms the tag is in the local image store. It does not prove the tag will resolve to the same content tomorrow.
For a more precise check, ask Docker for the image's repository digests:
$ docker image inspect --format '{{json .RepoDigests}}' hello-world:latest
["docker.io/library/hello-world@sha256:REPLACE_WITH_THE_DIGEST"]
A digest is a content identifier. The placeholder above is intentional: copy the actual value your registry prints, not an example digest from documentation.
4. Pull an immutable digest
Use a digest when a deployment or audit must refer to exactly one image manifest. A digest replaces the tag:
$ docker pull docker.io/library/hello-world@sha256:REPLACE_WITH_THE_DIGEST
docker.io/library/hello-world@sha256:REPLACE_WITH_THE_DIGEST: Pulling from library/hello-world
...
Digest: sha256:REPLACE_WITH_THE_DIGEST
Status: Image is up to date for docker.io/library/hello-world@sha256:REPLACE_WITH_THE_DIGEST
Replace the whole digest reference with a real value from a trusted registry or from the inspection above. Do not invent a digest, and do not quietly substitute a tag when pinning matters.
Tip
A digest keeps the content fixed, so it will not drift to a newer image with later fixes. Updating a pinned deployment is an explicit change: select and review a new digest, then update the deployment reference.
5. Pull from another registry
A registry address goes at the start of the image name and has no https:// prefix. For a private registry, use its host, optional port, namespace and repository:
$ docker pull registry.example.test:5000/team/app:2026-09
2026-09: Pulling from team/app
...
Status: Downloaded newer image for registry.example.test:5000/team/app:2026-09
registry.example.test:5000/team/app:2026-09
Run docker login registry.example.test:5000 first when the registry requires credentials.
Security warning
docker login changes Docker's credential configuration. Use the registry's approved authentication method, keep passwords out of shell history, and do not paste credentials into the pull command. Docker normally uses HTTPS for registry communication unless the daemon has been configured to allow an insecure registry. That daemon configuration is an administrative security boundary, not a pull-option shortcut.
6. Select a platform for multi-platform images
A multi-platform image can provide different manifests for different CPU and operating-system combinations. Normally, let Docker choose for the host. If you need a specific target, pass --platform:
$ docker pull --platform linux/amd64 hello-world:latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
Use the platform value your image and workload need, such as linux/amd64 or linux/arm64. Pulling a platform-specific variant does not make a program compiled for one architecture run natively on another. Check the selected result when it matters:
$ docker image inspect --format '{{.Os}}/{{.Architecture}}' hello-world:latest
linux/amd64
Checkpoint
The output should match the platform you requested. If it does not, check the exact image reference and whether you are inspecting a different local tag or image ID.
7. Pull every tag only with a clear reason
By default, Docker pulls one image. --all-tags requests every tagged image in a repository:
$ docker pull --all-tags registry.example.test:5000/team/app
Pulling repository registry.example.test:5000/team/app
...
This can download many images and use a lot of storage. It is usually a poor choice for a deployment or routine update. Prefer a reviewed tag or digest.
Recovery
If an all-tags pull is running and you need to stop it, press Ctrl-C. Docker terminates the pull when the client process is interrupted or its connection to the daemon is lost. Check the local image list afterwards rather than assuming nothing was stored.
8. Diagnose the common failures
A non-zero exit status means the pull did not complete. Match the symptom to the likely cause:
permission deniedor a daemon connection error. Local Docker access or daemon state. Checkdocker infoand your installation's service and group configuration.manifest unknownor a similar registry response. Usually the repository, tag or digest is wrong, unavailable, or not visible to your account. Recheck the full name and authenticate to the intended registry.- Timeouts or failed layer downloads. Network, proxy, registry or daemon configuration. Repeating the command may resume work, but it does not fix a consistently broken path.
- A good pull, then a container-start failure. A separate problem. Verify the image's platform, digest and local metadata first, then investigate the container command.
Checkpoint
Record the exact image reference and digest that passed verification. That small record stops a later tag lookup being mistaken for the same content.
Done means
- Version known. You know the installed Docker CLI version and pull syntax.
- Reference explicit. The image, repository and tag or digest were written out in full.
- Arrival confirmed. The local image list and, where needed,
docker image inspectshow what arrived. - Pinned when it matters. A digest is used when repeatability counts, with its update trade-off understood.
- Platform matches. Platform selection fits the workload's target architecture.
- Risky choices deliberate. Credentials, insecure-registry settings and broad all-tags pulls were treated as administrative decisions.