Docker Compose — Project Name & Directory
Every Docker Compose stack has a project name. This name prefixes all resources Compose creates — containers, networks, and volumes. Understanding how it works prevents naming collisions and confusion.
What is the Project Name?
The project name is used as a prefix for everything Compose creates:
Project name: myapp
Resources created:
Container: myapp-web-1
Container: myapp-db-1
Network: myapp_default
Volume: myapp_pgdata
How Compose Determines the Project Name
Compose uses this priority order:
| Priority | Source | Example |
|---|---|---|
| 1 | --project-name flag |
docker compose -p myapp up |
| 2 | COMPOSE_PROJECT_NAME env var |
export COMPOSE_PROJECT_NAME=myapp |
| 3 | name: in compose.yml |
name: myapp (top-level key) |
| 4 | Directory name | /home/user/myapp/ → myapp |
Default: Directory Name
The most common case — Compose uses the directory name:
# Project directory
pwd
# /home/user/awesome-project
docker compose up -d
# Resources prefixed with "awesome-project"
docker compose ps
NAME STATUS
awesome-project-web-1 running
awesome-project-db-1 running
Setting Project Name Explicitly
Option 1: Command-line flag
docker compose -p myapp up -d
docker compose -p myapp ps
docker compose -p myapp down
Important: When using -p, you must include it in every command, or Compose won’t find the running stack.
Option 2: Environment variable
export COMPOSE_PROJECT_NAME=myapp
docker compose up -d
docker compose ps # Works without -p
Option 3: Top-level name: key
# compose.yml
name: myapp
services:
web:
image: nginx
This is the cleanest approach — the project name travels with the file.
Why Project Names Matter
Avoiding Collisions
If two projects use the same compose file structure in different directories:
/home/user/project-a/compose.yml → project-a-web-1
/home/user/project-b/compose.yml → project-b-web-1
Different directories = different project names = no collisions.
The Danger of Generic Names
# BAD — generic directory name
cd /tmp/test
docker compose up -d
# Creates: test-web-1, test-db-1
# Later, different project
cd /tmp/test2
# If you accidentally cd to /tmp/test first...
docker compose down # OOPS — tears down the wrong stack!
Best practice: Use the name: key in your compose file or meaningful directory names.
Listing All Compose Projects
docker compose ls
NAME STATUS CONFIG FILES
myapp running(2) /home/user/myapp/compose.yml
blog running(3) /home/user/blog/compose.yml
Summary
| Method | Example | Best For |
|---|---|---|
| Directory name | cd myapp && docker compose up |
Default, simple projects |
name: key |
name: myapp in compose.yml |
Explicit, portable |
-p flag |
docker compose -p myapp up |
Quick override |
| Env var | COMPOSE_PROJECT_NAME=myapp |
CI/CD pipelines |
Quick Reference
| Item | Detail |
|---|---|
| Default project name | Current directory name |
| Explicit name | name: myapp in compose.yml |
| CLI override | docker compose -p myapp up |
| Env var | COMPOSE_PROJECT_NAME=myapp |
| List projects | docker compose ls |
| Naming convention | Container: project-service-number |