dockerignore richtig nutzen - was nicht ins Image gehört
dockerignore richtig nutzen - was nicht ins Image gehört
.dockerignore ist eine der unterschätztesten Optimierungen beim Docker-Build — sie hält unnötige Dateien aus dem Image heraus und beschleunigt den Build-Prozess messbar.
Was ist der Build-Kontext?
Wenn man docker build . ausführt, sendet Docker den gesamten Inhalt des angegebenen Verzeichnisses (.) als Build-Kontext an den Daemon. Alles in diesem Verzeichnis ist potenziell im Image — unabhängig davon, ob man COPY . . hat oder nicht. Erst die Übertragung selbst kostet Zeit und Speicher.
Ohne .dockerignore:
Sending build context to Docker daemon 450MB ← node_modules, .git, Logs...
Mit .dockerignore:
Sending build context to Docker daemon 2.3MB
Syntax
.dockerignore funktioniert wie .gitignore:
# Kommentar
.git
node_modules
*.log
.env
.env.*
__pycache__
*.pyc
dist/
coverage/
.DS_Store
Negation mit !:
# Alles ignorieren außer src/ und package.json
*
!src/
!package.json
!package-lock.json
Typische Einträge
Node.js:
node_modules
npm-debug.log
.npm
dist
coverage
Python:
__pycache__
*.pyc
*.pyo
.venv
venv
.pytest_cache
Allgemein (fast immer sinnvoll):
.git
.gitignore
.env
.env.*
*.log
.DS_Store
Thumbs.db
README.md
docs/
tests/
Warum .env besonders wichtig ist
Eine .env-Datei, die API-Keys oder Datenbankpasswörter enthält, landet ohne .dockerignore im Build-Kontext. Falls COPY . . im Dockerfile steht, landet sie im Image — und damit in jeder Registry, in die das Image gepusht wird.
.env
.env.local
.env.production
Diese Zeilen gehören in jede .dockerignore.
Einfluss auf den Layer-Cache
.dockerignore beeinflusst auch, wann der Cache für COPY . . invalidiert wird. Dateien, die ausgeschlossen sind, können sich ändern ohne den Cache zu brechen — was gerade bei großen node_modules-Verzeichnissen den Build deutlich schneller macht.