Many teams start Docker delivery with a single tag: latest. It is fast at first, but once you need collaboration, rollback, or debugging, the weakness shows immediately. The real problem is not the tag syntax. It is that you can no longer answer one simple question: what exact version is production running right now?
The main problem with latest is ambiguity
If you build and push like this:
docker build -t registry.example.com/blog-api:latest .
docker push registry.example.com/blog-api:latest
several common failures appear later:
- local
latestand server-sidelatestmay not point to the same image - a teammate can push a new
latestwithout a visible version boundary - rollback becomes hard because the previous stable image is unclear
- logs and dashboards show
latest, which tells you almost nothing
latest can be a convenience alias. It should not be the only release identity.
A minimal tag model that works
For small and medium projects, a practical approach is to keep two tag types:
- a human-readable release version, such as date plus sequence
- an unambiguous Git SHA tag
For example:
docker build -t registry.example.com/blog-api:2026-04-09-1 .
docker tag registry.example.com/blog-api:2026-04-09-1 registry.example.com/blog-api:git-a1b2c3d
docker push registry.example.com/blog-api:2026-04-09-1
docker push registry.example.com/blog-api:git-a1b2c3d
That gives you three concrete benefits:
- humans can quickly identify whether this is today’s release
- systems can map the image to one exact commit
- rollback can target a known older version
If you still want latest, keep it as an extra alias, not as the source of truth.
Deploy explicit tags, not vague tags
Once the image exists, the deployment environment should run a concrete version.
In docker compose.yml, for example:
services:
blog:
image: registry.example.com/blog-api:2026-04-09-1
restart: unless-stopped
That is much safer than latest, because you can see the running version immediately.
When you upgrade later, the change should be deliberate: replace the old version tag with the new one. Do not make the server guess what latest means at that moment.
Tag design and release order should match
Changing the tag format alone is not enough. The delivery steps also need a fixed sequence. A solid minimal path is:
- verify behavior locally
- build the image
- create the version tag and Git SHA tag
- push to the registry
- pull the explicit version in the target environment
- restart the service and inspect logs
Example:
docker build -t registry.example.com/blog-api:2026-04-09-1 .
docker tag registry.example.com/blog-api:2026-04-09-1 registry.example.com/blog-api:git-a1b2c3d
docker push registry.example.com/blog-api:2026-04-09-1
docker push registry.example.com/blog-api:git-a1b2c3d
docker compose pull
docker compose up -d
docker compose logs --tail=100
The value is not clever commands. The value is that the same path can be repeated every time.
Rollback matters as much as release
With explicit tags, rollback becomes simple:
docker compose down
# change the image tag in compose back to the previous version
docker compose up -d
If your whole process depends only on latest, rollback becomes painful. You do not know what the previous version was, and the registry tag may already have been overwritten again.
Operationally, the ability to go back cleanly is as important as the ability to go forward quickly.
Common mistakes
- assuming
latestis enough because only one service exists - creating version tags during build but still deploying
latest - checking only
docker psafter release and never verifying the image tag - never mapping Git commits to image versions
These problems stay quiet in the earliest stage, but they become expensive once release frequency increases.
Keep a more durable release habit
Image tags are not decoration. They are the locator inside your delivery chain. Once you establish a small model of version tags, Git SHA tags, and explicit deployment tags, Docker release stops being something that merely works once. It becomes a delivery path that is traceable, reviewable, and reversible. That foundation still holds later when CI/CD becomes more automated.
Join the discussion
Sign in and share your thoughts on this article below.