docker-image-management
Guide for creating, building, and managing Docker images and containers. Use this skill when working with Dockerfiles, containerization, image building, registry operations, container runtime, storage
SKILL.mdskills/docker-image-management/SKILL.md
GitHubDocker Image Management Skill
This skill covers the full lifecycle of Docker container images: authoring Dockerfiles, building with BuildKit, running containers, managing storage, pushing to registries, and scanning for vulnerabilities.
Quick Decision Guide
| Task | Load |
|---|---|
| Writing or optimizing a Dockerfile, multi-stage builds, build cache, build secrets | references/build.md |
| Running containers, networking, mounts, resource limits, capabilities | references/run.md |
| Tagging, pushing/pulling, Docker Hub auth, image scanning (Scout) | references/registry.md |
| Multi-container apps | references/docker-compose-examples.yml |
| Dockerfile templates for Node, Python, Go, Java, etc. | references/dockerfile-templates.md |
Always load the relevant reference file before giving guidance on that topic.
Core Principles
Security first
- Run as a non-root
USER— always. Docker Scout flags containers running as root. - Never embed secrets in image layers. Use build-time
--secretmounts or runtime env vars. - Use official or verified publisher base images. Pin to a specific tag (e.g.
node:22-alpine) or digest for reproducibility.
Layer efficiency
- Order
COPY/RUNinstructions from least-to-most frequently changed to maximize cache reuse. - Install dependencies before copying app code.
- Combine
apt-get update && apt-get installin a singleRUN; clean up in the same layer. - Use multi-stage builds to keep production images free of build tools.
BuildKit is the default
BuildKit is enabled by default in Docker Engine 23.0+ and Docker Desktop. It provides:
- Parallel stage execution
- Efficient layer caching
- Secret mounts (
--secret) - SSH forwarding (
--ssh) - Inline cache export
Use docker buildx build for advanced features (multi-platform, custom builders). docker build wraps Buildx.
Standard Workflow
1. Analyze requirements
Before writing a Dockerfile, identify:
- Runtime vs. build-only dependencies
- Exposed ports
- Required env vars and config
- Persistent data (volumes)
- Security context (user, capabilities)
2. Write the Dockerfile
Read references/build.md for Dockerfile instruction guidance and patterns.
Copy a starter from references/dockerfile-templates.md and customize.
3. Create .dockerignore
Exclude node_modules/, .git/, .env, *.log, build output dirs, and test files.
See references/dockerignore-template for language-specific patterns.
4. Build the image
# Standard build
docker build -t myapp:1.0 .
# Build + push in one step
docker build --push -t registry.example.com/myapp:1.0 .
# Pull fresh base, bypass cache
docker build --pull --no-cache -t myapp:1.0 .
# Pass a build secret (never use --build-arg for secrets)
docker build --secret id=mysecret,src=.env -t myapp:1.0 .
5. Run and test
docker run --rm -p 3000:3000 myapp:1.0
docker logs <container>
docker exec -it <container> sh
Read references/run.md for full runtime options.
6. Tag and push
docker tag myapp:1.0 myorg/myapp:1.0
docker push myorg/myapp:1.0
Read references/registry.md for authentication, tagging strategy, and vulnerability scanning.
Debugging Checklist
| Symptom | Action |
|---|---|
| Container exits immediately | docker logs <container> |
| Port not reachable | Check -p HOST:CONTAINER, verify EXPOSE |
| File not found in container | Check .dockerignore, verify COPY paths |
| Permission denied | Check USER and file ownership |
| Large image size | Use multi-stage build, alpine base, .dockerignore |
| Build cache not working | Verify COPY order; check if files changed |
| Secret exposed in layer | Use --secret mount, not --build-arg |