Skip to content

Updating Containers

This guide explains how to check if Docker containers are outdated and update them safely.

  1. Pull latest image - Downloads new image layers from Docker Hub
  2. Recreate container - docker compose up -d detects new image and recreates
  3. Verify - Compare running container image ID with local image ID

Important:

  • Containers don’t auto-update when images change
  • Old images remain until removed (docker image prune)
  • Data in volumes is preserved during update
Terminal window
docker inspect <container_name> --format '{{.Image}}'
Terminal window
docker pull <image>:latest
Terminal window
docker images --format "{{.ID}}" <image>:latest

If the IDs differ, an update is needed.

Terminal window
cd /opt/docker/<service>
docker compose up -d

This recreates the container with the new image while preserving volumes.

Terminal window
docker inspect <container_name> --format '{{.Image}}'

Should now match the local image ID.

Terminal window
$ docker inspect n8n --format '{{.Image}}'
sha256:c52e366997414009f8a8cdb6b6e87f7d198c93ba7ce341626cd1510f771b8902
Terminal window
$ docker pull n8nio/n8n:latest
Digest: sha256:94f108ec1ed2ee17198fff2432d580b184b54c609bc23e27889f5ed6b98a4789
Status: Image is up to date for n8nio/n8n:latest
Terminal window
$ docker images --format "{{.ID}}" n8nio/n8n:latest
05ec79d62bc4

Running ID (c52e36699741) ≠ Latest ID (05ec79d62bc4) → Update needed

Terminal window
$ cd /opt/docker/n8n
$ docker compose up -d
Container n8n Recreate
Container n8n Recreated
Container n8n Starting
Container n8n Started
Terminal window
$ docker inspect n8n --format '{{.Image}}'
sha256:05ec79d62bc4c2ee6b7b53449e8e90944439f7a6967d77e78fcc9d1c409d5e07
$ docker images --format "{{.ID}}" n8nio/n8n:latest
05ec79d62bc4

IDs match - update successful.

Check all containers at once:

Terminal window
echo "Container Status Check"
echo "======================"
for container in traefik n8n postgres-main adminer promtail; do
image=$(docker inspect $container --format '{{.Config.Image}}' 2>/dev/null)
running=$(docker inspect $container --format '{{.Image}}' 2>/dev/null | cut -c8-19)
latest=$(docker images --format "{{.ID}}" $image 2>/dev/null)
if [ "$running" = "$latest" ]; then
status="OK"
else
status="OUTDATED"
fi
printf "%-15s %s\n" "$container:" "$status"
done

After updating, remove unused images:

Terminal window
docker image prune -f

This removes dangling images (untagged layers from old versions).