Docker Image Builds for Python Services
Image naming
Images follow the pattern: mitodl/<service-name>
The service name should match the application or code location name used elsewhere in configuration (Helm values, Pulumi stacks, Concourse pipelines).
Image tags
Tag images with the git short ref (7-character SHA):
GIT_TAG=$(git rev-parse --short HEAD)
docker build -t mitodl/${SERVICE_NAME}:${GIT_TAG} .Do not use latest as a production tag.
Python environment inside the image
Use a relocatable virtual environment so the venv works after Docker layer assembly:
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv venv --relocatable /app/.venv && \
uv sync --frozen --no-devShared libraries
Install shared internal libraries (e.g. ol-orchestrate-lib) as build-time dependencies — do not mount them as Docker volumes at runtime. Add them to pyproject.toml and let uv sync install them during the image build.
Build context & .dockerignore
Exclude development artifacts:
.venv/
__pycache__/
*.pyc
.git/Concourse CI integration
Concourse pipelines use paths: filters on git resources to trigger image rebuilds only when relevant files change. When adding a new service, add its path to the corresponding pipeline's git resource paths list.