โ๏ธ Init Containers = Setup Tasks
Apps need setup before start. Init containers run before main containers. Database migrations, permissions, downloads.
๐ Init Container Basics
apiVersion: v1
kind: Pod
metadata:
name: app-with-init
spec:
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'echo "Initializing database..." && sleep 5']
- name: init-permissions
image: busybox
command: ['sh', '-c', 'chmod -R 777 /data']
containers:
- name: main-app
image: myapp:latest
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
๐ฏ Init Container Examples
# Database migration
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 1
template:
spec:
initContainers:
- name: migrate-db
image: myapp:migration
env:
- name: DB_HOST
value: postgres-service
command: ['sh', '-c', 'npm run migrate']
containers:
- name: app
image: myapp:latest
env:
- name: DB_HOST
value: postgres-service
# Download assets
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
initContainers:
- name: download-assets
image: curlimages/curl
command: ['sh', '-c', 'curl -o /assets/data.json https://example.com/data.json']
volumeMounts:
- name: assets
mountPath: /assets
containers:
- name: app
image: myapp:latest
volumeMounts:
- name: assets
mountPath: /app/assets
volumes:
- name: assets
emptyDir: {}
# Wait for service
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
initContainers:
- name: wait-for-db
image: busybox
command: ['sh', '-c', 'until nc -z postgres-service 5432; do echo "Waiting for database..."; sleep 2; done']
containers:
- name: app
image: myapp:latest
๐ก Init Container Tips
- Use for database migrations
- Use for asset downloads
- Use for permission setup
- Use for waiting on dependencies
- Run in order, one at a time
“Init containers run before main. Setup, migrations, dependencies. Essential for app initialization.”
