About docker-project-foundations
A skill for agents setting up Docker in projects from scratch. It scaffolds a starter Dockerfile, Compose development stack, and ignore rules, with guidance for containerized dependencies and safe defaults.
Key features
- 01Scaffolds .dockerignore, Dockerfile, and compose.yaml
- 02Adds dependencies as Compose services
- 03Guides local development and production layouts
- 04Handles npm credentials with BuildKit secrets
- 05Includes setup verification script
Use cases
- 01Initialize Docker files for a project
- 02Add a database, cache, or queue for development
- 03Set up a local Docker-based development environment
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ docker/ skills --skill docker-project-foundationsAfter installing, type/docker-project-foundationsin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
skill.yamlagents/openai.yamlassets/compose-dev.yamlDockerfile.simpledockerignore-examplechecks/verification.mdreferences/project-structure.mdscripts/verify-setup.shDetails
From the project READMEDocker Project Foundations
Overview
This skill guides you in Dockerizing a project from scratch. It focuses on creating the initial Docker file set, choosing a sane layout, and preferring containerized dependencies over host-level installs.
When to use this skill
Activate this skill when:
- A user asks you to set up, initialize, or Dockerize a project
- A project needs an initial
Dockerfile,compose.yaml, or.dockerignoreand does not have one - A user wants to add a service dependency (database, cache, message queue) to a project
- A user asks how to run or develop a project locally and Docker is available
Do not use this skill when
Do not use this skill when:
- The user explicitly wants to avoid Docker
- The project already has a mature Docker setup and only needs minor edits
- The main task is optimizing an existing
Dockerfile - The main task is editing or debugging an existing Compose stack
Core guidance
Always create these three files
When Dockerizing a project, always produce all three:
.dockerignore— Create this first so the initial build context is small and safe. Seeassets/dockerignore-examplefor a reference.Dockerfile— Create a working starter image definition that the project can build and run with. Seeassets/Dockerfile.simple.compose.yaml— Create a local development stack that includes the application service and any required dependencies. Seeassets/compose-dev.yaml.
npm registry credentials
- Exclude
.npmrcat every depth with**/.npmrcin.dockerignore; otherwise a broad source copy can persist credentials in image layers. - The Node.js starter mounts
npmrcas a BuildKit secret for bothnpm cisteps. Public-package builds need no secret. For private registries, pass the config explicitly:
Use the actual config path if the project keeps it elsewhere. Never copy the credential file or pass its values throughDOCKER_BUILDKIT=1 docker build --secret id=npmrc,src="$HOME/.npmrc" .ARGorENV. Dependency scripts run during installation can access the mounted secret; use trusted dependencies and a least-privilege registry token. - For private-registry builds through Compose, add this optional override as
compose.npm.yamlalongside the starter'scompose.yaml:
Build withservices: app: build: secrets: - npmrc secrets: npmrc: file: ${NPMRC_PATH:?Set NPMRC_PATH to your npm config file}NPMRC_PATH="$HOME/.npmrc" docker compose -f compose.yaml -f compose.npm.yaml build. This grants build-time access only, not a runtime secret. Public-package builds should omit the override so no credential file is required.
Prefer Dockerized dependencies over host installs
When a project needs a database (Postgres, MySQL, MongoDB), cache (Redis, Memcached), queue (RabbitMQ, Kafka), or any other infrastructure service:
- Always define it as a service in
compose.yamlinstead of telling the user to install it on the host. - Never suggest
brew install postgres,apt install redis, or similar host-level installs for development dependencies. - Use official Docker images from Docker Hub for these services.
- Configure services with environment variables, not config files baked into images.
Bootstrap checklist
- Name the file
compose.yamlrather than legacy Compose filenames. - Put all three files at the project root unless there is a clear multi-service layout that justifies a
docker/subdirectory. - Ensure the initial setup can build and start locally with one command path.
- Bind published application ports to loopback by default. Widen the host address only when another device must reach the development service.
- Keep unauthenticated datastores on the Compose network instead of publishing their ports. If local host tools require database access, publish only to loopback.
- If a development-only credential fallback enables one-command startup, label it clearly and document a
.envoverride. - Use Compose services for local databases, caches, and queues instead of host installs.
- Keep the first scaffold simple; defer detailed image optimization and advanced Compose tuning to the owning skills.
Development vs production
- Development: Use bind mounts for live reload, publish application ports on loopback by default, and enable verbose logging. Keep unauthenticated datastores on the Compose network; publish a datastore port only on loopback when local host tools require it.
- Production: Use multi-stage builds, copy only built artifacts, do not mount source code, minimize image layers, set appropriate resource limits.
- Keep a single
Dockerfilethat supports both via build stages and build arguments when possible.
File placement
- Place
Dockerfileat the project root (or in adocker/subdirectory if the project has multiple services). - Place
compose.yamlat the project root. - Place
.dockerignoreat the project root, next to theDockerfile.
Related skills
- For Dockerfile optimization, cache strategy, non-root execution, and image hardening, use
docker-build-strategies. - For service dependencies, health checks, overrides, volumes, networks, and Compose debugging, use
docker-compose-patterns. - For destructive Docker CLI commands (
docker system prune,docker rm -f, image/network/builder pruning) and a cross-product index of destructive-command guardrails, usedocker-destructive-guardrails.
References
references/project-structure.md— Detailed guidance on Docker project file organization, naming conventions, and multi-service layouts.
Assets
assets/dockerignore-example— A comprehensive.dockerignorefor a typical project.assets/compose-dev.yaml— A development-oriented Compose file with Dockerized dependencies.assets/Dockerfile.simple— A basic multi-stage Dockerfile following best practices.
Scripts
scripts/verify-setup.sh— Checks that required files exist in the current directory and validates itscompose.yaml. Run it from the project root, with the script path resolved under this skill's directory:
Replacebash "<skill-dir>/scripts/verify-setup.sh" [--help]<skill-dir>with the absolute path of the folder that contains thisSKILL.md; thescripts/path is relative to that folder, not to the project. Do not change into the skill directory first: the script checks the current directory. If the skill directory cannot be resolved, check that.dockerignore,Dockerfile, andcompose.yamlexist in the project root, then rundocker compose config --quiet. Exit status is0when verification succeeds or help is requested,1when required files are missing or the Compose configuration is invalid, and2for invalid arguments.
Checks
checks/verification.md— Detailed verification checklist for manual review.