The Ubuntu Docker image pulled for Apple Silicon appears to have adopted PEP 668, producing the below error when attempting to install Pip requirements in the absence of a virtual environment.
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.
See /usr/share/doc/python3.11/README.venv for more information.
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Changes
Added a virtual environment to the app-config and app-base images.
Prepended the binary directory of the virtual environment to PATH in these images so that the environment does not need to be explicitly sourced.
Replaced apt-get calls with apt (newer, more user-friendly).
How to Test
Ensure that the Docker build succeeds on both Intel (tested by me) and Apple Silicon.
Ensure that Django commands (e.g., python manage.py shell) can be run in child containers without sourcing the virtual environment.
Notes
It appears that, on Intel, Python 3.10 is installed, but on Apple Silicon, Python 3.11 is.
Context
The Ubuntu Docker image pulled for Apple Silicon appears to have adopted PEP 668, producing the below error when attempting to install Pip requirements in the absence of a virtual environment.
Changes
app-config
andapp-base
images.PATH
in these images so that the environment does not need to be explicitly sourced.apt-get
calls withapt
(newer, more user-friendly).How to Test
python manage.py shell
) can be run in child containers without sourcing the virtual environment.Notes