[PATCH v2 05/13] recipes-containers/images: add app-container-python
Tim Orling <[email protected]> Mon, 6 Jul 2026 10:12:40 -0700
| Newsgroups | org.yoctoproject.lists.meta-virtualization |
|---|---|
| Message-ID | <43d049a0aa53687d96887df265d6e2ec0a2021fe.1783356922.git.tim.orling@konsulko.com> |
From: Tim Orling <[email protected]> Add OCI container image recipe for Python to use as a base for other Python app containers. The image uses multi-layer mode with separate base, terminal and python layers. Add ncurses-terminfo-base to a "terminal" layer to avoid warnings in the REPL: "Cannot read termcap database; using dumb terminal settings." Add coreutils to "python" layer to provide /usr/bin/env needed by python3-idle in python3-modules. Inherit container-nonroot-user and run a `nonroot` user by default. Set PACKAGECONFIG:pn-app-container-python = "dev" in local.conf or distro/image config to run as 'root' and include 'pip'. Inherit container-volatile-fixup to ensure /var/volatile/{tmp,log} are available, if needed. Inherit container-dev-mode to optionally run as UID '0' root user and provide a shell. Signed-off-by: Tim Orling <[email protected]> --- .../images/app-container-python.bb | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 recipes-containers/images/app-container-python.bb diff --git a/recipes-containers/images/app-container-python.bb b/recipes-containers/images/app-container-python.bb new file mode 100644 index 00000000..19a64814 --- /dev/null +++ b/recipes-containers/images/app-container-python.bb @@ -0,0 +1,45 @@ +SUMMARY = "Base python3 container image" +DESCRIPTION = "OCI container image running Python with non-root user. \ +\ +In 'dev' mode, can optionally run as 'root' and add 'pip' to allow \ +developers to simply run 'pip install' on top of this container (Not \ +advised for production/hardened use)." +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +# Multi-layer mode: create explicit layers instead of single rootfs layer +OCI_LAYER_MODE = "multi" + +# Optional 'dev' mode: +# - adds a shell to the container +# - adds python3-pip to the python layer (enables `pip install` at runtime) +# - runs the container as root (UID 0) so pip can write to site-packages +# Enable with: PACKAGECONFIG:pn-app-container-python = "dev" +PACKAGECONFIG ??= "" +PACKAGECONFIG[dev] = "" +inherit container-dev-mode + +# Define layers: each layer contains specific packages +# Format: "name:type:content" where content uses + as delimiter for multiple items +OCI_LAYERS = "\ + base:packages:base-files+base-passwd+netbase \ + ${@bb.utils.contains('PACKAGECONFIG', 'dev', 'shell:packages:${CONTAINER_SHELL}', '', d)} \ + terminal:packages:ncurses-terminfo-base \ + python:packages:python3+coreutils${@bb.utils.contains('PACKAGECONFIG', 'dev', '+python3-pip', '', d)} \ +" + +# Use CMD so `docker run image /bin/sh` works as expected +OCI_IMAGE_CMD = "python3" + +IMAGE_FSTYPES = "container oci" +inherit image +inherit image-oci +inherit container-nonroot-user +inherit container-volatile-fixup + +IMAGE_FEATURES = "" +IMAGE_LINGUAS = "" +NO_RECOMMENDATIONS = "1" + +# Allow build with or without a specific kernel +IMAGE_CONTAINER_NO_DUMMY = "1" -- 2.54.0