Summary
openedx-platform has migrated its Python dependency management from pip-compile to pyproject.toml + uv (public-engineering#543, landed in openedx-platform#38915).
To avoid an immediate break, that migration kept generated compatibility exports at the old paths. Tutor's Dockerfile depends on all three of them:
Production image -- bind-mounted from the edx-platform build stage:
https://github.com/overhangio/tutor/blob/master/tutor/templates/build/openedx/Dockerfile#L116-L119
RUN --mount=type=bind,from=edx-platform,source=/requirements/edx/base.txt,target=/openedx/edx-platform/requirements/edx/base.txt \
--mount=type=bind,from=edx-platform,source=/requirements/edx/assets.txt,target=/openedx/edx-platform/requirements/edx/assets.txt \
--mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
$PIP_COMMAND install -r /openedx/edx-platform/requirements/edx/base.txt -r /openedx/edx-platform/requirements/edx/assets.txt
Development image (tutor dev) -- installed directly in the development build stage:
https://github.com/overhangio/tutor/blob/master/tutor/templates/build/openedx/Dockerfile#L295
RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
$PIP_COMMAND install -r requirements/edx/development.txt
We've filed a Fast-Track DEPR ticket to remove these compatibility exports (they're now redundant with pyproject.toml/uv.lock, which are the real source of truth): openedx/public-engineering#552
Earliest date the files may be removed: 2026-08-05. Once that happens, both the production and development image builds will start failing unless they're updated first.
Suggested migration
Instead of installing from the three flat requirements files, install from the locked project directly with uv, e.g. something along the lines of:
RUN --mount=type=bind,from=edx-platform,source=/pyproject.toml,target=/openedx/edx-platform/pyproject.toml \
--mount=type=bind,from=edx-platform,source=/uv.lock,target=/openedx/edx-platform/uv.lock \
--mount=type=cache,target=/openedx/.cache/uv,sharing=shared \
cd /openedx/edx-platform && uv sync --frozen --no-default-groups --group assets --no-install-project
and similarly with --group dev (or whatever the corresponding group is named) for the development stage's install.
(exact group name(s) and flags will need adjusting to match whatever assets.txt/development.txt were exporting -- happy to help work out the details if useful.) Alternatively, uv export --frozen --no-hashes ... can still produce a flat requirements-style file on demand from pyproject.toml/uv.lock at build time, if minimizing changes to the existing pip install flow is preferred.
Why raising this now
Wanted to give as much lead time as possible given Tutor is the primary way most operators build and deploy Open edX -- this is a heads-up, not an urgent ask. Let us know if there's anything from the openedx-platform side that would help with the transition.
Edit: added the development.txt usage above, which I'd missed in the original version of this issue.
Summary
openedx-platform has migrated its Python dependency management from pip-compile to
pyproject.toml+ uv (public-engineering#543, landed in openedx-platform#38915).To avoid an immediate break, that migration kept generated compatibility exports at the old paths. Tutor's Dockerfile depends on all three of them:
Production image -- bind-mounted from the edx-platform build stage:
https://github.com/overhangio/tutor/blob/master/tutor/templates/build/openedx/Dockerfile#L116-L119
RUN --mount=type=bind,from=edx-platform,source=/requirements/edx/base.txt,target=/openedx/edx-platform/requirements/edx/base.txt \ --mount=type=bind,from=edx-platform,source=/requirements/edx/assets.txt,target=/openedx/edx-platform/requirements/edx/assets.txt \ --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \ $PIP_COMMAND install -r /openedx/edx-platform/requirements/edx/base.txt -r /openedx/edx-platform/requirements/edx/assets.txtDevelopment image (
tutor dev) -- installed directly in thedevelopmentbuild stage:https://github.com/overhangio/tutor/blob/master/tutor/templates/build/openedx/Dockerfile#L295
RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \ $PIP_COMMAND install -r requirements/edx/development.txtWe've filed a Fast-Track DEPR ticket to remove these compatibility exports (they're now redundant with
pyproject.toml/uv.lock, which are the real source of truth): openedx/public-engineering#552Earliest date the files may be removed: 2026-08-05. Once that happens, both the production and development image builds will start failing unless they're updated first.
Suggested migration
Instead of installing from the three flat requirements files, install from the locked project directly with
uv, e.g. something along the lines of:RUN --mount=type=bind,from=edx-platform,source=/pyproject.toml,target=/openedx/edx-platform/pyproject.toml \ --mount=type=bind,from=edx-platform,source=/uv.lock,target=/openedx/edx-platform/uv.lock \ --mount=type=cache,target=/openedx/.cache/uv,sharing=shared \ cd /openedx/edx-platform && uv sync --frozen --no-default-groups --group assets --no-install-projectand similarly with
--group dev(or whatever the corresponding group is named) for thedevelopmentstage's install.(exact group name(s) and flags will need adjusting to match whatever
assets.txt/development.txtwere exporting -- happy to help work out the details if useful.) Alternatively,uv export --frozen --no-hashes ...can still produce a flat requirements-style file on demand frompyproject.toml/uv.lockat build time, if minimizing changes to the existingpip installflow is preferred.Why raising this now
Wanted to give as much lead time as possible given Tutor is the primary way most operators build and deploy Open edX -- this is a heads-up, not an urgent ask. Let us know if there's anything from the openedx-platform side that would help with the transition.
Edit: added the
development.txtusage above, which I'd missed in the original version of this issue.