Tutor 21.0.1 images build openedx fails on uv pip install 'n' /

Hi all,

I’m running a fresh experimental Open edX Indigo install with Tutor and seem to have hit a consistent image‑build error that seems unrelated to any specific XBlock and blocks all new XBlock installs. I had Perplexity analyze and draft up a post describing the issue, which follows:

Environment

• Tutor: 21.0.1 (installed via pip)

• Open edX: Indigo (fresh deployment)

• Host: Ubuntu inside a KVM VM

• Tutor managed via a virtualenv (tutor-venv)

• Disk usage: ~78% of a 72G LV, ~16G free, /var/lib/docker ≈ 21G, /home/edx ≈ 3.6G

The platform itself runs fine: LMS/Studio are up, existing functionality is OK. The problem only appears when I try to rebuild the openedx image to add a new XBlock.

What I’m trying to do

I’m attempting to install openedx-cmi5-xblock via Tutor’s supported mechanisms:

1. Initially used private.txt, then switched to OPENEDX_EXTRA_PIP_REQUIREMENTS.

2. Current setting:

tutor config printvalue OPENEDX_EXTRA_PIP_REQUIREMENTS

# output:

openedx-cmi5-xblock

3. Then I run:

tutor images build openedx --no-cache

tutor local restart lms cms

tutor local exec lms pip list | grep -i cmi5

…but pip list inside the LMS container never shows openedx-cmi5-xblock, and the component doesn’t appear in Studio’s Advanced components list.

Build failure details

A clean build with logging:

tutor images build openedx --no-cache 2>&1 | tee openedx-build-fail.log

grep -n “PIP_COMMAND” openedx-build-fail.log | head -20

grep -n “install ‘n’” openedx-build-fail.log | head -20

The relevant snippets:

4063:#49 [python-requirements 12/27] RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared uv pip install ‘n’

4068:#49 ERROR: process “/bin/sh -c $PIP_COMMAND install ‘n’” did not complete successfully: exit code: 1

4070: > [python-requirements 12/27] RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared uv pip install ‘n’:

4080: 139 | >>> $PIP_COMMAND install ‘n’

4083:ERROR: failed to build: failed to solve: process “/bin/sh -c $PIP_COMMAND install ‘n’” did not complete successfully: exit code: 1

So in the python-requirements stage, the build is literally doing:

uv pip install ‘n’

# i.e., effectively: $PIP_COMMAND install ‘n’

which tries to install a package named n and fails. Because this step fails, the entire openedx image build aborts before it can process my OPENEDX_EXTRA_PIP_REQUIREMENTS, which explains why no new XBlock (including openedx-cmi5-xblock) ever appears in pip list in the LMS container.

I also never see a line like “Collecting openedx-cmi5-xblock” in the build logs.

What I’ve already checked

• Disk space: sufficient (about 16G free on /), and I can still start/stop the existing Tutor stack.

• OPENEDX_EXTRA_PIP_REQUIREMENTS is correctly set as a plain string:

o It previously printed [‘openedx-cmi5-xblock’], which I corrected to openedx-cmi5-xblock using:

tutor config save --set OPENEDX_EXTRA_PIP_REQUIREMENTS=“openedx-cmi5-xblock”

• Running other Tutor commands like tutor local exec lms pip list works; the breakage seems confined to the openedx image build’s python-requirements phase using uv pip install ‘n’.

Questions

1. Is this uv pip install ‘n’ / $PIP_COMMAND install ‘n’ line a known issue/bug in Tutor 21.0.1 (Indigo) or its generated Dockerfile/templates?

2. Where in the Tutor/Indigo build configuration should I look to see why that python-requirements step is getting pip install ‘n’ instead of a real package list or requirements file?

3. Is there an advised workaround or patch (e.g., editing a specific Dockerfile or template) so that:

o tutor images build openedx completes normally, and

o OPENEDX_EXTRA_PIP_REQUIREMENTS=openedx-cmi5-xblock (and other XBlocks) are actually installed?

4. If this is a regression specific to Tutor 21.0.1 + Indigo, is there a recommended version pin (earlier Tutor/Open edX combo) that’s currently preferred for XBlock experimentation?

This KVM is purely experimental, so I’m fine with rebuilding/cleaning if needed, but I’d like to understand and fix the underlying uv pip install ‘n’ problem rather than just trial‑and‑error more builds.

Happy to share more of openedx-build-fail.log or full docker buildx output if that would help.

Thanks in advance for any guidance.

Richard Civille

tutor config save --set OPENEDX_EXTRA_PIP_REQUIREMENTS=“openedx-cmi5-xblock”

This should be tutor config save --set OPENEDX_EXTRA_PIP_REQUIREMENTS="[openedx-cmi5-xblock]". This setting is supposed to be a list, when you pass a plain string it tries to pip install each letter of the string:

pip install o
pip install p
pip install e
pip install n
...

Thanks very much for the tip, enclosing the xBlock with brackets seemed to do the trick. I had enclosed the label in the advanced configuration editor but neglected to do the same on the tutor config save process. There’s also some confusion whether the xblock label name uses dashes or underscores, I’ve seen it noted both ways and the advance config editor seems to require underscores while the tutor command requires dashes. openedx-cmi5-xblock or openedx_cmi5_xblock. I’ve seen it referenced both ways in the github readme page.

So, it seems that:

The correct combination is:

  • OPENEDX_EXTRA_PIP_REQUIREMENTS="[openedx-cmi5-xblock]" (package name with dashes for Tutor/pip), and

  • openedx_cmi5_xblock in the course’s Advanced Module List (entry point name with underscores).
    That matches the package README and worked for me on Tutor 21.0.1 / Indigo.

    Thanks again!