Help generating docker images from PDM projects
Project description
pdm-dockerize
Help generating docker image from PDM projects.
Installation
Install pdm-dockerize:
With uv
If you installed pdm with uv:
uv tool install pdm --with pdm-dockerize
With pipx
If you installed pdm with pipx and want to have the command for all projects:
pipx inject pdm pdm-dockerize
With pip
If you manually installed pdm with pip, just install the extra dependency in the same environment:
pip install pdm-dockerize
With pdm
You can also install it as a standard pdm plugin.
Either globally:
pdm self add pdm-dockerize
Either as a local plugin in your project:
[tool.pdm]
plugins = [
"pdm-dockerize",
]
Then:
pdm install --plugins
Usage
Just use pdm dockerize in your multistage build:
# syntax=docker/dockerfile:1
ARG PY_VERSION=3.12
##
# Build stage: build and install dependencies
##
FROM python:${PY_VERSION} AS builder
ARG VERSION=0.dev
ENV PDM_BUILD_SCM_VERSION=${VERSION}
WORKDIR /project
# install PDM
RUN pip install -U pip setuptools wheel
RUN pip install pdm pdm-dockerize
RUN --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
--mount=type=bind,source=pdm.lock,target=pdm.lock \
--mount=type=cache,target=$HOME/.cache,uid=$UUID \
pdm dockerize --prod -v
##
# Run stage: create the final runtime container
##
FROM python:${PY_VERSION} AS runtime
WORKDIR /app
# Fetch built dependencies
COPY --from=builder /project/dist/docker /app
# Copy needed files from your project (filter using `.dockerignore`)
COPY . /app
ENTRYPOINT ["/app/entrypoint"]
CMD ["your-default-command"]
Using uv
When PDM is configured with use_uv = true, pdm-dockerize automatically uses uv pip install --target
instead of the default pip-based installer for faster dependency installation.
If uv is not found at runtime, it falls back gracefully to the pip-based installer.
Lockfiles generated by uv (which store extras as separate entries) are automatically handled.
Here is an example Dockerfile using uv:
# syntax=docker/dockerfile:1
ARG PY_VERSION=3.12
##
# Build stage: build and install dependencies
##
FROM python:${PY_VERSION} AS builder
ARG VERSION=0.dev
ENV PDM_BUILD_SCM_VERSION=${VERSION}
WORKDIR /project
# install uv, PDM and pdm-dockerize
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
RUN uv pip install --system pdm pdm-dockerize
# enable uv as PDM downloader
RUN pdm config use_uv true
RUN --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
--mount=type=bind,source=pdm.lock,target=pdm.lock \
--mount=type=cache,target=$HOME/.cache,uid=$UUID \
pdm dockerize --prod -v
##
# Run stage: create the final runtime container
##
FROM python:${PY_VERSION} AS runtime
WORKDIR /app
# Fetch built dependencies
COPY --from=builder /project/dist/docker /app
# Copy needed files from your project (filter using `.dockerignore`)
COPY . /app
ENTRYPOINT ["/app/entrypoint"]
CMD ["your-default-command"]
Command line options
pdm dockerize [OPTIONS] [TARGET]
| Option | Description |
|---|---|
TARGET |
Output directory (default: dist/docker) |
--prod / --production |
Select production dependencies only |
-G GROUP / --group GROUP |
Select a specific dependency group (can be repeated) |
--no-default |
Do not include the default dependencies |
--dry-run |
Preview what would be installed without writing |
-L LOCKFILE / --lockfile LOCKFILE |
Use an alternative lockfile |
Selecting scripts
By default, the dockerize command will render a script without any command as it does not select any script by default.
You can select scripts with the include and exclude properties of the tool.pdm.dockerize section.
Those properties are optional, can be either a string or list of string.
Each string is a fnmatch filter pattern
Dockerize first select script based on the include patterns and then filter-out those matching with any exclude pattern.
Include all scripts
[tool.pdm.dockerize]
include = "*"
Include some specific scripts
[tool.pdm.dockerize]
include = ["my-script", "my-other-script"]
Include all scripts excluding those matching prefix-*
[tool.pdm.dockerize]
include = "*"
exclude = "prefix-*"
Include all scripts matching a prefix but two
[tool.pdm.dockerize]
include = "prefix-*"
exclude = ["prefix-not-you", "prefix-you-neither"]
Selecting binaries
By default, the dockerize command will not copy any python executable provided by your dependencies.
You can select binaries with the include_bins and exclude_bins properties of the tool.pdm.dockerize section.
Syntax and behavior are exactly the exact sames than include/exclude for script selection.
Include all python executables
[tool.pdm.dockerize]
include_bins = "*"
Include some specific executables
Most of the time, it will look like this:
[tool.pdm.dockerize]
include_bins = ["uvicorn"]
Generated entrypoint
The dockerize command generates a POSIX sh entrypoint script alongside the installed packages.
This entrypoint exposes selected PDM scripts as subcommands. Here is what it does:
PYTHONPATH: automatically set to includelib/. Forpdm.backend-based projects using src-layout, the package source directory is also added.PATH: automatically set to includebin/, so any installed console-script binaries are available.- Pre/post scripts: if you define
pre_<script>orpost_<script>hooks in your PDM scripts, they are executed before and after the main script respectively. {args}interpolation: the PDM{args}and{args:defaults}placeholder syntax is supported. Arguments passed to the entrypoint subcommand are forwarded through"$@". When no{args}placeholder is present, arguments are appended automatically.- Script kinds: all PDM script kinds are supported:
cmd,call,shell, andcomposite.
Controlling environment
pdm-dockerize respects defined environment variables:
- scripts
envvariables are properly set - shared
_.envvariables are properly set - scripts
env_fileare properly loaded - shared
_.env_fileare properly loaded
In addition, you can define some docker-only environment variables using the tool.pdm.dockerize.env table
or some docker-only .env files using tool.pdm.dockerize.env_file
Defining docker-only environment variables
Those environment variables will only be effective in the docker entrypoint.
[tool.pdm.dockerize.env]
VAR = "value"
Loading docker-only environment files
This file will only be loaded in the docker entrypoint.
[tool.pdm.dockerize]
env_file = "docker.env"
Internals
This plugin works by subclassing some pdm classes to reuse the installation process:
DockerizeEnvironment, apdmPythonLocalEnvironmenttargeting the dockerize output directoryDockerizeInstallManager, apdmInstallManagerfiltering binariesDockerizeSynchronizer, apdmSynchronizerusing aDockerizeInstallManagerasInstallManagerDockerizeUvSynchronizer, an alternative synchronizer that invokesuv pip install --targetas a subprocess whenuse_uvis enabledFilteringDestination, apdmInstallDestinationfiltering binaries
This way, the dockerization reuses the same installation process, just tuned for docker and augmented with pdm-dockerize specifics.
Contributing
Read the dedicated contributing guidelines.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pdm_dockerize-0.7.1.tar.gz.
File metadata
- Download URL: pdm_dockerize-0.7.1.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: pdm/2.26.6 CPython/3.12.3 Linux/6.14.0-1017-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2bb0613e16fcd1d75cfa28f9cd35c5bcb7baffd82e5f0f8680452360483686c
|
|
| MD5 |
cbbac8870fa62fa6fd529a225600e827
|
|
| BLAKE2b-256 |
5a72263ca3572b1f8439c49b6d69fbec6c01d6568862537537a6195ab006f7b2
|
File details
Details for the file pdm_dockerize-0.7.1-py3-none-any.whl.
File metadata
- Download URL: pdm_dockerize-0.7.1-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: pdm/2.26.6 CPython/3.12.3 Linux/6.14.0-1017-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
944a005d47dd719610909a2e5a4ceff09f95548d294dc91ac51a92cb9f93f201
|
|
| MD5 |
0882820c09f68d7ab6954451806e9f10
|
|
| BLAKE2b-256 |
8e40fffc158c994dfee96775f1ee04ec1dfbaf15f65e5da4027c898da14eea34
|