50 lines
1.2 KiB
Markdown
50 lines
1.2 KiB
Markdown
# Containerization
|
|
|
|
Package your app and its environment together so it runs identically on every machine — dev, CI, and production.
|
|
|
|
## Tools
|
|
|
|
**Docker** is the standard. Everything else (Podman, containerd) is compatible with Docker images.
|
|
|
|
## Key Concepts
|
|
|
|
- **Image** — a snapshot of your app + OS + dependencies
|
|
- **Container** — a running instance of an image
|
|
- **Dockerfile** — the recipe for building an image
|
|
- **Local CI pattern** — run your test suite inside a container before pushing; catches environment drift before it reaches remote CI
|
|
|
|
## Minimal Dockerfile (Python)
|
|
|
|
```dockerfile
|
|
FROM python:3.12-slim
|
|
|
|
WORKDIR /app
|
|
COPY pyproject.toml .
|
|
RUN pip install uv && uv pip install --system -e ".[dev]"
|
|
|
|
COPY . .
|
|
CMD ["python", "-m", "mypackage"]
|
|
```
|
|
|
|
## Quickstart
|
|
|
|
```bash
|
|
# build
|
|
docker build -t myapp .
|
|
|
|
# run
|
|
docker run --rm myapp
|
|
|
|
# local CI — run tests inside the container
|
|
docker run --rm myapp pytest
|
|
|
|
# interactive shell for debugging
|
|
docker run --rm -it myapp bash
|
|
```
|
|
|
|
## Tips
|
|
|
|
- Use `.dockerignore` to exclude `__pycache__`, `.git`, `.venv`, `*.pyc`
|
|
- Pin the base image tag (`python:3.12-slim`, not `python:latest`)
|
|
- Layer ordering matters: copy dependency files before source so the install layer is cached
|