* [meta-virtualization][PATCH 0/7] Container improvements
@ 2026-05-30 1:31 Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 1/7] classes: add container-nonroot-user.bbclass Tim Orling
` (7 more replies)
0 siblings, 8 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
This series:
* Adds a class to create/run containers with a non-root user
* Adds new containers:
- app-container-python
- app-containter-mosquitto
- app-container-valkey
- app-container-nginx
* Modifies app-container-curl to be more like the upstream
experience (and more like the above containers)
* Allows meta-webserver/recipes-http to be parsed for
vcontainer distro so we can build multiarch containers
for app-container-nginx, etc.
Each of these containers was built in a MACHINE=qemuarm64
environment as well as mc:container-amd64+mc:container-arm64
multiarch environment.
The resulting containers were tested with simple command line
usage compared to Docker provided equivalents to ensure the
same expected behavior.
Tim Orling (7):
classes: add container-nonroot-user.bbclass
recipes-containers/images: add app-container-python
recipes-containers/images: add app-container-mosquitto
recipes-containers/images: add app-container-valkey
recipes-containers/images: add app-container-nginx
vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd
app-container-curl: use multilayer mode; container-nonroot-user
classes/container-nonroot-user.bbclass | 68 ++++++++++++++++
conf/distro/include/vcontainer-bbmask.inc | 2 +-
conf/layer.conf | 1 +
.../images/app-container-curl.bb | 29 ++++++-
.../images/app-container-mosquitto.bb | 46 +++++++++++
.../images/app-container-nginx.bb | 77 +++++++++++++++++++
.../images/app-container-python.bb | 57 ++++++++++++++
.../images/app-container-valkey.bb | 61 +++++++++++++++
8 files changed, 336 insertions(+), 5 deletions(-)
create mode 100644 classes/container-nonroot-user.bbclass
rename {recipes-demo => recipes-containers}/images/app-container-curl.bb (58%)
create mode 100644 recipes-containers/images/app-container-mosquitto.bb
create mode 100644 recipes-containers/images/app-container-nginx.bb
create mode 100644 recipes-containers/images/app-container-python.bb
create mode 100644 recipes-containers/images/app-container-valkey.bb
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 1/7] classes: add container-nonroot-user.bbclass
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python Tim Orling
` (6 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
For secure and production environments, we want to run containers as a
non-root user. Some applications, such as Python, require a $HOME
directory with proper permissions. Because OCI_LAYERS :directories:
copies with 'cp -a --no-preserve=ownership', we need a fixup function
to create the proper permissions and ownership in a new raw layer.
The behavior here is inspired by dhi.io/python:3 (Docker Hardened Image)
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
classes/container-nonroot-user.bbclass | 68 ++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 classes/container-nonroot-user.bbclass
diff --git a/classes/container-nonroot-user.bbclass b/classes/container-nonroot-user.bbclass
new file mode 100644
index 00000000..5139ce8b
--- /dev/null
+++ b/classes/container-nonroot-user.bbclass
@@ -0,0 +1,68 @@
+# For secure and production environments, we want to run containers as a
+# non-root user. Some applications, such as Python, require a $HOME
+# directory with proper permissions. Because OCI_LAYERS :directories:
+# copies with 'cp -a --no-preserve=ownership', we need a fixup function
+# to create the proper permissions and ownership in a new raw layer.
+
+# The behavior here is inspired by dhi.io/python:3 (Docker Hardened Image)
+
+inherit extrausers
+
+NONROOT_USER ?= "nonroot"
+NONROOT_UID ?= "65532"
+NONROOT_GID ?= "65532"
+
+# ---------------------------------------------------------------------------
+# Create the unprivileged "nonroot" user (uid 65532, group 65532)
+# ---------------------------------------------------------------------------
+EXTRA_USERS_PARAMS = "\
+ groupadd -g ${NONROOT_GID} ${NONROOT_USER}; \
+ useradd -m -u ${NONROOT_UID} -g ${NONROOT_GID} -d /home/${NONROOT_USER} ${NONROOT_USER}; \
+"
+
+# Allow a container to choose to run as 'root'
+OCI_IMAGE_RUNTIME_UID ?= "${NONROOT_UID}"
+OCI_IMAGE_ENV_VARS = "HOME=/home/${NONROOT_USER}"
+
+# Make sure we can write to e.g. /home/nonroot/.python_history
+# using :directories: in OCI_LAYERS does not preserve permissions
+fakeroot fix_oci_home_perms() {
+ cd ${IMGDEPLOYDIR}
+ image_name="${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci"
+ layer_tar="${WORKDIR}/oci-home-fix-layer.tar"
+
+ rm -f "$layer_tar"
+
+ python3 - "$layer_tar" <<'PYEOF'
+import sys, tarfile, time
+
+layer_tar = sys.argv[1]
+mtime = int(time.time())
+
+# (path, mode, uid, gid)
+entries = [
+ ("home", 0o755, 0, 0),
+ ("home/${NONROOT_USER}", 0o700, ${NONROOT_UID}, ${NONROOT_GID}),
+]
+
+with tarfile.open(layer_tar, "w") as tar:
+ for name, mode, uid, gid in entries:
+ info = tarfile.TarInfo(name=name)
+ info.type = tarfile.DIRTYPE
+ info.mode = mode
+ info.uid = uid
+ info.gid = gid
+ info.uname = "" # numeric-only; let umoci canonicalize
+ info.gname = ""
+ info.mtime = mtime
+ tar.addfile(info)
+PYEOF
+
+ umoci raw add-layer --image "$image_name:${OCI_IMAGE_TAG}" "$layer_tar"
+ rm -f "$layer_tar"
+
+ rm -f "$image_name.tar" "$image_name-dir.tar"
+ ( cd "$image_name" && tar -cf "../$image_name.tar" "." )
+ tar -cf "$image_name-dir.tar" "$image_name"
+}
+do_image_oci[postfuncs] += "fix_oci_home_perms"
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 1/7] classes: add container-nonroot-user.bbclass Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-06-02 10:01 ` Paul Barker
2026-05-30 1:31 ` [meta-virtualization][PATCH 3/7] recipes-containers/images: add app-container-mosquitto Tim Orling
` (5 subsequent siblings)
7 siblings, 1 reply; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
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'.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
.../images/app-container-python.bb | 57 +++++++++++++++++++
1 file changed, 57 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..a93f1b0f
--- /dev/null
+++ b/recipes-containers/images/app-container-python.bb
@@ -0,0 +1,57 @@
+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 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] = ""
+
+# 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 \
+ terminal:packages:ncurses-terminfo-base \
+ python:packages:python3+coreutils${@bb.utils.contains('PACKAGECONFIG', 'dev', '+python3-pip', '', d)} \
+"
+
+# In 'dev' mode, override the nonroot UID inherited from container-nonroot-user
+# so the container runs as root (required for `pip install`).
+OCI_IMAGE_RUNTIME_UID = "${@bb.utils.contains('PACKAGECONFIG', 'dev', '0', '${NONROOT_UID}', 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
+
+IMAGE_FEATURES = ""
+IMAGE_LINGUAS = ""
+NO_RECOMMENDATIONS = "1"
+
+# IMAGE_INSTALL triggers package builds via do_rootfs recrdeptask.
+# Even for multi-layer mode, list packages here to ensure they're built.
+# The PM will install them directly to layers from DEPLOY_DIR_IPK.
+# Note: IMAGE_ROOTFS is still created but ignored for packages layers.
+IMAGE_INSTALL = "base-files base-passwd netbase"
+IMAGE_INSTALL += "ncurses-terminfo-base"
+IMAGE_INSTALL += "python3 coreutils"
+IMAGE_INSTALL += "${@bb.utils.contains('PACKAGECONFIG', 'dev', 'python3-pip', '', d)}"
+
+# Allow build with or without a specific kernel
+IMAGE_CONTAINER_NO_DUMMY = "1"
+
+# Note: No ROOTFS_POSTPROCESS_COMMAND needed - IMAGE_ROOTFS is empty
+# and PM handles installation directly to OCI layers
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 3/7] recipes-containers/images: add app-container-mosquitto
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 1/7] classes: add container-nonroot-user.bbclass Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 4/7] recipes-containers/images: add app-container-valkey Tim Orling
` (4 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
Add OCI container image recipe for the Eclipse Mosquitto MQTT broker.
The image uses multi-layer mode with separate base and mosquitto layers,
exposes standard MQTT (1883) and WebSocket (9001) ports, and launches
mosquitto with its default config file as the entrypoint.
Inherit container-nonroot-user to run as 'nonroot' with UID 65532.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
.../images/app-container-mosquitto.bb | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 recipes-containers/images/app-container-mosquitto.bb
diff --git a/recipes-containers/images/app-container-mosquitto.bb b/recipes-containers/images/app-container-mosquitto.bb
new file mode 100644
index 00000000..37e34a47
--- /dev/null
+++ b/recipes-containers/images/app-container-mosquitto.bb
@@ -0,0 +1,46 @@
+SUMMARY = "Mosquitto MQTT broker container image"
+DESCRIPTION = "OCI container running the Eclipse Mosquitto MQTT broker \
+with standard MQTT (1883) and WebSocket (9001) listeners enabled."
+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"
+
+# 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 \
+ mosquitto:packages:mosquitto \
+"
+
+IMAGE_FSTYPES = "container oci"
+inherit image
+inherit image-oci
+inherit container-nonroot-user
+
+IMAGE_FEATURES = ""
+IMAGE_LINGUAS = ""
+NO_RECOMMENDATIONS = "1"
+
+IMAGE_INSTALL = " \
+ base-files \
+ base-passwd \
+ netbase \
+ mosquitto \
+"
+
+# Allow build with or without a specific kernel
+IMAGE_CONTAINER_NO_DUMMY = "1"
+
+# Workaround /var/volatile for now
+ROOTFS_POSTPROCESS_COMMAND += "rootfs_fixup_var_volatile ; "
+rootfs_fixup_var_volatile () {
+ install -m 1777 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/tmp
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/log
+}
+
+OCI_IMAGE_ENTRYPOINT = "${sbindir}/mosquitto"
+OCI_IMAGE_ENTRYPOINT_ARGS = "-c '${sysconfdir}/mosquitto/mosquitto.conf'"
+OCI_IMAGE_PORTS = "1883/tcp 9001/tcp"
+OCI_IMAGE_TAG = "latest"
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 4/7] recipes-containers/images: add app-container-valkey
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
` (2 preceding siblings ...)
2026-05-30 1:31 ` [meta-virtualization][PATCH 3/7] recipes-containers/images: add app-container-mosquitto Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 5/7] recipes-containers/images: add app-container-nginx Tim Orling
` (3 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
Add OCI container image recipe for the Valkey in-memory key-value
datastore. The image uses multi-layer mode with separate base and
valkey layers, exposes the standard Valkey port (6379), and launches
valkey-server with its default config file as the entrypoint.
The stock valkey.conf shipped by meta-oe is tuned for a host install
(daemonize yes, syslog-enabled yes, bind 127.0.0.1). Override those at
launch so the server stays in the foreground as PID 1, logs to stdout,
and is reachable from outside the container.
Inherit container-nonroot-user to run as 'nonroot' with UID 65532 by
default. Can optionally set PACKAGECONFIG:pn-app-container-valkey = "dev"
in local.conf or a distro/image config to run as root.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
.../images/app-container-valkey.bb | 61 +++++++++++++++++++
1 file changed, 61 insertions(+)
create mode 100644 recipes-containers/images/app-container-valkey.bb
diff --git a/recipes-containers/images/app-container-valkey.bb b/recipes-containers/images/app-container-valkey.bb
new file mode 100644
index 00000000..b3da2efd
--- /dev/null
+++ b/recipes-containers/images/app-container-valkey.bb
@@ -0,0 +1,61 @@
+SUMMARY = "Valkey key-value store container image"
+DESCRIPTION = "OCI container running the Valkey in-memory key-value \
+datastore, a flexible distributed datastore that supports both caching \
+and beyond caching workloads."
+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:
+# - runs the container as root (UID 0)
+# Enable with: PACKAGECONFIG:pn-app-container-valkey = "dev"
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[dev] = ""
+
+# 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 \
+ valkey:packages:valkey \
+"
+
+IMAGE_FSTYPES = "container oci"
+inherit image
+inherit image-oci
+inherit container-nonroot-user
+
+IMAGE_FEATURES = ""
+IMAGE_LINGUAS = ""
+NO_RECOMMENDATIONS = "1"
+
+IMAGE_INSTALL = " \
+ base-files \
+ base-passwd \
+ netbase \
+ valkey \
+"
+
+# Allow build with or without a specific kernel
+IMAGE_CONTAINER_NO_DUMMY = "1"
+
+# Workaround /var/volatile for now
+ROOTFS_POSTPROCESS_COMMAND += "rootfs_fixup_var_volatile ; "
+rootfs_fixup_var_volatile () {
+ install -m 1777 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/tmp
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/log
+}
+
+OCI_IMAGE_ENTRYPOINT = "${bindir}/valkey-server"
+# The stock valkey.conf shipped by meta-oe is tuned for a host install
+# (daemonize yes, syslog-enabled yes, bind 127.0.0.1). Override those at
+# launch so the server stays in the foreground as PID 1, logs to stdout,
+# and is reachable from outside the container.
+OCI_IMAGE_ENTRYPOINT_ARGS = "'${sysconfdir}/valkey/valkey.conf' \
+ --daemonize no \
+ --syslog-enabled no \
+ --bind '0.0.0.0 -::*' \
+ --protected-mode no"
+OCI_IMAGE_PORTS = "6379/tcp"
+OCI_IMAGE_TAG = "latest"
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 5/7] recipes-containers/images: add app-container-nginx
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
` (3 preceding siblings ...)
2026-05-30 1:31 ` [meta-virtualization][PATCH 4/7] recipes-containers/images: add app-container-valkey Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 6/7] vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd Tim Orling
` (2 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
Add OCI container image recipe for the NGINX web server. The image
uses multi-layer mode with separate base, nginx packages, nginx
runtime directories, and nginx log file layers. Exposes the standard
HTTP port (80) and launches nginx with 'daemon off' so it stays in
the foreground as PID 1 and logs to stderr.
Add ROOTFS_POSTPROCESS fixups to create the runtime directories
nginx expects: /var/volatile/{tmp,log}, /var/log/nginx (resolved
explicitly to guarantee inclusion in the container layer regardless
of /var/log symlink ordering), and /run/nginx for nginx's compiled-in
temp paths (client_body_temp, proxy_temp, etc.) which are not created
by any package. Also create empty /var/log/nginx/{access,error}.log
to avoid do_image_oci warnings.
Inherit container-nonroot-user with NONROOT_USER = "nginx" to run with
UID 65532 by default. Set PACKAGECONFIG:pn-app-container-nginx = "dev"
in local.conf or distro/image config to run as 'root'.
Add SKIP_RECIPE and comment to layer.conf since nginx requires
meta-webserver.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
conf/layer.conf | 1 +
.../images/app-container-nginx.bb | 77 +++++++++++++++++++
2 files changed, 78 insertions(+)
create mode 100644 recipes-containers/images/app-container-nginx.bb
diff --git a/conf/layer.conf b/conf/layer.conf
index 2a4a4c91..6ea8ccf8 100644
--- a/conf/layer.conf
+++ b/conf/layer.conf
@@ -33,6 +33,7 @@ LAYERDEPENDS_virtualization-layer = " \
# webserver:
# - naigos requires apache2
# - cockpit-machines requires cockpit
+# - app-container-nginx requires nginx
LAYERRECOMMENDS_virtualization-layer = " \
webserver \
selinux \
diff --git a/recipes-containers/images/app-container-nginx.bb b/recipes-containers/images/app-container-nginx.bb
new file mode 100644
index 00000000..09844376
--- /dev/null
+++ b/recipes-containers/images/app-container-nginx.bb
@@ -0,0 +1,77 @@
+SUMMARY = "Base NGINX container image for development"
+DESCRIPTION = "OCI container with NGINX web server."
+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:
+# - runs the container as root (UID 0)
+# Enable with: PACKAGECONFIG:pn-app-container-nginx = "dev"
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[dev] = ""
+NONROOT_USER = "nginx"
+
+OCI_IMAGE_APP_RECIPE = "nginx"
+
+# 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 \
+ nginx:packages:nginx \
+ nginx-dirs:directories:${localstatedir}/log/nginx+/run/nginx+${localstatedir}/volatile/tmp+${localstatedir}/volatile/log \
+ nginx-files:files:${localstatedir}/log/nginx/access.log+${localstatedir}/log/nginx/error.log \
+"
+# Use CMD so `docker run image /bin/sh` works as expected
+OCI_IMAGE_CMD = ""
+
+IMAGE_FSTYPES = "container oci"
+inherit image
+inherit image-oci
+inherit container-nonroot-user
+
+IMAGE_FEATURES = ""
+IMAGE_LINGUAS = ""
+NO_RECOMMENDATIONS = "1"
+
+IMAGE_INSTALL = " \
+ base-files \
+ base-passwd \
+ netbase \
+ nginx \
+"
+
+# Allow build with or without a specific kernel
+IMAGE_CONTAINER_NO_DUMMY = "1"
+
+# Workaround /var/volatile for now
+ROOTFS_POSTPROCESS_COMMAND:append = " rootfs_fixup_var_volatile ; "
+rootfs_fixup_var_volatile () {
+ install -m 1777 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/tmp
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/log
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/volatile/log/nginx
+
+ # Fix do_image_oci warnings
+ # OCI: File not found in IMAGE_ROOTFS: /var/log/nginx/access.log
+ touch ${IMAGE_ROOTFS}/${localstatedir}/volatile/log/nginx/access.log
+ touch ${IMAGE_ROOTFS}/${localstatedir}/volatile/log/nginx/error.log
+
+ # nginx opens the compiled-in error_log path before reading -c config.
+ # /var/log is typically a symlink to /var/volatile/log in a Yocto rootfs,
+ # so create the target path explicitly to guarantee the directory lands in
+ # the container layer regardless of symlink resolution order.
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/log
+ install -m 755 -d ${IMAGE_ROOTFS}/${localstatedir}/log/nginx
+
+ # nginx's compiled-in temp paths (client_body_temp, proxy_temp, etc.) all
+ # live under /run/nginx, which is not created by any package.
+ install -m 755 -d ${IMAGE_ROOTFS}/run/nginx
+}
+
+OCI_IMAGE_ENTRYPOINT = "/usr/sbin/nginx"
+OCI_IMAGE_ENTRYPOINT_ARGS = "-g 'daemon off; error_log stderr notice;'"
+OCI_IMAGE_PORTS = "80/tcp"
+OCI_IMAGE_TAG = "latest"
+
+SKIP_RECIPE[app-container-nginx] ?= "${@bb.utils.contains('BBFILE_COLLECTIONS', 'webserver', '', 'Depends on meta-webserver which is not included', d)}"
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 6/7] vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
` (4 preceding siblings ...)
2026-05-30 1:31 ` [meta-virtualization][PATCH 5/7] recipes-containers/images: add app-container-nginx Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 7/7] app-container-curl: use multilayer mode; container-nonroot-user Tim Orling
2026-06-05 3:31 ` [meta-virtualization][PATCH 0/7] Container improvements Bruce Ashfield
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
Allow us to build nginx, apache2, etc. multiarch containers.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
conf/distro/include/vcontainer-bbmask.inc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/conf/distro/include/vcontainer-bbmask.inc b/conf/distro/include/vcontainer-bbmask.inc
index ac74464f..077255cb 100644
--- a/conf/distro/include/vcontainer-bbmask.inc
+++ b/conf/distro/include/vcontainer-bbmask.inc
@@ -93,6 +93,7 @@ BBMASK += "meta-networking/recipes-(?!filter|support)"
BBMASK += "meta-openstack/recipes-dbs/postgresql/"
BBMASK += "meta-oe/dynamic-layers/networking-layer/recipes-core/"
BBMASK += "meta-openstack/recipes-extended/libvirt/"
+BBMASK += "meta-webserver/recipes-(?!httpd)"
# ---------------------------------------------------------------------------
# Entire layers with 0 recipes in the container image dependency graph.
@@ -101,7 +102,6 @@ BBMASK += "meta-openstack/recipes-extended/libvirt/"
# ---------------------------------------------------------------------------
BBMASK += "meta-filesystems/"
BBMASK += "meta-python/"
-BBMASK += "meta-webserver/"
# Warning suppression for these fully-masked layers is in meta-virt-host.conf
# (BBFILE_PATTERN_IGNORE_EMPTY) because BitBake checks the base datastore,
# not per-multiconfig datastores.
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-virtualization][PATCH 7/7] app-container-curl: use multilayer mode; container-nonroot-user
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
` (5 preceding siblings ...)
2026-05-30 1:31 ` [meta-virtualization][PATCH 6/7] vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd Tim Orling
@ 2026-05-30 1:31 ` Tim Orling
2026-06-05 3:31 ` [meta-virtualization][PATCH 0/7] Container improvements Bruce Ashfield
7 siblings, 0 replies; 11+ messages in thread
From: Tim Orling @ 2026-05-30 1:31 UTC (permalink / raw)
To: meta-virtualization
* Move to recipes-containers/images to show maintenance intent
* Switch to multilayer mode to more like the other "library"/"official"
container recipes.
* Change OCI_IMAGE_TAG to "latest" for similar reasons.
* Change OCI_IMAGE_ENTRYPOINT_ARGS to "--help" to be more like upstream
containers.
* Install ca-certificates to enable handling https:// sites
* Inherit container-nonroot-user to run as 'nonroot' with UID 65532 by
default. Set PACKAGECONFIG:pn-app-container-curl = "dev" in local.conf
or distro/image config to run as `root` and include a CONTAINER_SHELL.
Signed-off-by: Tim Orling <tim.orling@konsulko.com>
---
.../images/app-container-curl.bb | 29 ++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
rename {recipes-demo => recipes-containers}/images/app-container-curl.bb (58%)
diff --git a/recipes-demo/images/app-container-curl.bb b/recipes-containers/images/app-container-curl.bb
similarity index 58%
rename from recipes-demo/images/app-container-curl.bb
rename to recipes-containers/images/app-container-curl.bb
index ddeb3022..34204fb9 100644
--- a/recipes-demo/images/app-container-curl.bb
+++ b/recipes-containers/images/app-container-curl.bb
@@ -2,9 +2,31 @@ SUMMARY = "Curl Application container image"
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:
+# - runs the container as root (UID 0)
+# Enable with: PACKAGECONFIG:pn-app-container-curl = "dev"
+PACKAGECONFIG ??= ""
+PACKAGECONFIG[dev] = ""
+
+# 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)} \
+ curl:packages:curl+ca-certificates \
+"
+
+# In 'dev' mode, override the nonroot UID inherited from container-nonroot-user
+# so the container runs as root.
+OCI_IMAGE_RUNTIME_UID = "${@bb.utils.contains('PACKAGECONFIG', 'dev', '0', '${NONROOT_UID}', d)}"
+
IMAGE_FSTYPES = "container oci"
inherit image
inherit image-oci
+inherit container-nonroot-user
IMAGE_FEATURES = ""
IMAGE_LINGUAS = ""
@@ -39,8 +61,7 @@ rootfs_fixup_var_volatile () {
}
OCI_IMAGE_ENTRYPOINT = "curl"
-OCI_IMAGE_TAG = "easy"
-OCI_IMAGE_ENTRYPOINT_ARGS = "http://localhost:80"
-CONTAINER_SHELL = "busybox"
+OCI_IMAGE_TAG = "latest"
+OCI_IMAGE_ENTRYPOINT_ARGS = "--help"
-IMAGE_INSTALL:append = " curl"
+IMAGE_INSTALL:append = " curl ca-certificates"
--
2.54.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python
2026-05-30 1:31 ` [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python Tim Orling
@ 2026-06-02 10:01 ` Paul Barker
2026-06-02 12:02 ` Bruce Ashfield
0 siblings, 1 reply; 11+ messages in thread
From: Paul Barker @ 2026-06-02 10:01 UTC (permalink / raw)
To: ticotimo, meta-virtualization
[-- Attachment #1: Type: text/plain, Size: 4451 bytes --]
On Fri, 2026-05-29 at 18:31 -0700, Tim Orling via lists.yoctoproject.org
wrote:
> 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'.
>
> Signed-off-by: Tim Orling <tim.orling@konsulko.com>
> ---
> .../images/app-container-python.bb | 57 +++++++++++++++++++
> 1 file changed, 57 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..a93f1b0f
> --- /dev/null
> +++ b/recipes-containers/images/app-container-python.bb
> @@ -0,0 +1,57 @@
> +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 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] = ""
> +
> +# 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 \
Hi Tim,
I wonder if we should define the base layer contents in image-oci to
ensure that it is consistent across recipes.
E.g. in image-oci.bbclass:
OCI_BASE_LAYER = "base:packages:base-files+base-passwd+netbase"
Then in the recipe:
OCI_LAYERS = "\
${OCI_BASE_LAYER} \
...
"
That gives consistency without forcing all OCI images to use the base
layer definition if it isn't relevant to them.
> + terminal:packages:ncurses-terminfo-base \
> + python:packages:python3+coreutils${@bb.utils.contains('PACKAGECONFIG', 'dev', '+python3-pip', '', d)} \
> +"
> +
> +# In 'dev' mode, override the nonroot UID inherited from container-nonroot-user
> +# so the container runs as root (required for `pip install`).
> +OCI_IMAGE_RUNTIME_UID = "${@bb.utils.contains('PACKAGECONFIG', 'dev', '0', '${NONROOT_UID}', 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
> +
> +IMAGE_FEATURES = ""
> +IMAGE_LINGUAS = ""
> +NO_RECOMMENDATIONS = "1"
> +
> +# IMAGE_INSTALL triggers package builds via do_rootfs recrdeptask.
> +# Even for multi-layer mode, list packages here to ensure they're built.
> +# The PM will install them directly to layers from DEPLOY_DIR_IPK.
> +# Note: IMAGE_ROOTFS is still created but ignored for packages layers.
> +IMAGE_INSTALL = "base-files base-passwd netbase"
Maybe we also need an OCI_BASE_PACKAGES to go with OCI_BASE_LAYER.
Pretty much every image is going to need these three packages installed.
> +IMAGE_INSTALL += "ncurses-terminfo-base"
> +IMAGE_INSTALL += "python3 coreutils"
> +IMAGE_INSTALL += "${@bb.utils.contains('PACKAGECONFIG', 'dev', 'python3-pip', '', d)}"
> +
> +# Allow build with or without a specific kernel
> +IMAGE_CONTAINER_NO_DUMMY = "1"
> +
> +# Note: No ROOTFS_POSTPROCESS_COMMAND needed - IMAGE_ROOTFS is empty
> +# and PM handles installation directly to OCI layers
Best regards,
--
Paul Barker
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 252 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python
2026-06-02 10:01 ` Paul Barker
@ 2026-06-02 12:02 ` Bruce Ashfield
0 siblings, 0 replies; 11+ messages in thread
From: Bruce Ashfield @ 2026-06-02 12:02 UTC (permalink / raw)
To: paul; +Cc: ticotimo, meta-virtualization
[-- Attachment #1: Type: text/plain, Size: 5778 bytes --]
On Tue, Jun 2, 2026 at 6:02 AM Paul Barker via lists.yoctoproject.org <paul=
pbarker.dev@lists.yoctoproject.org> wrote:
> On Fri, 2026-05-29 at 18:31 -0700, Tim Orling via lists.yoctoproject.org
> wrote:
> > 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'.
> >
> > Signed-off-by: Tim Orling <tim.orling@konsulko.com>
> > ---
> > .../images/app-container-python.bb | 57 +++++++++++++++++++
> > 1 file changed, 57 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..a93f1b0f
> > --- /dev/null
> > +++ b/recipes-containers/images/app-container-python.bb
> > @@ -0,0 +1,57 @@
> > +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 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] = ""
> > +
> > +# 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 \
>
> Hi Tim,
>
> I wonder if we should define the base layer contents in image-oci to
> ensure that it is consistent across recipes.
>
> E.g. in image-oci.bbclass:
>
> OCI_BASE_LAYER = "base:packages:base-files+base-passwd+netbase"
>
> Then in the recipe:
>
> OCI_LAYERS = "\
> ${OCI_BASE_LAYER} \
> ...
> "
>
> That gives consistency without forcing all OCI images to use the base
> layer definition if it isn't relevant to them.
>
We can't (and shouldn't) enforce using packages at the base like that,
since specifying layers as Tim is using is simply one way of doing it.
It could just as easily be another image, or one of the other techniques.
>
> > + terminal:packages:ncurses-terminfo-base \
> > +
> python:packages:python3+coreutils${@bb.utils.contains('PACKAGECONFIG',
> 'dev', '+python3-pip', '', d)} \
> > +"
> > +
> > +# In 'dev' mode, override the nonroot UID inherited from
> container-nonroot-user
> > +# so the container runs as root (required for `pip install`).
> > +OCI_IMAGE_RUNTIME_UID = "${@bb.utils.contains('PACKAGECONFIG', 'dev',
> '0', '${NONROOT_UID}', 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
> > +
> > +IMAGE_FEATURES = ""
> > +IMAGE_LINGUAS = ""
> > +NO_RECOMMENDATIONS = "1"
> > +
> > +# IMAGE_INSTALL triggers package builds via do_rootfs recrdeptask.
> > +# Even for multi-layer mode, list packages here to ensure they're built.
> > +# The PM will install them directly to layers from DEPLOY_DIR_IPK.
> > +# Note: IMAGE_ROOTFS is still created but ignored for packages layers.
> > +IMAGE_INSTALL = "base-files base-passwd netbase"
>
> Maybe we also need an OCI_BASE_PACKAGES to go with OCI_BASE_LAYER.
> Pretty much every image is going to need these three packages installed.
>
Again, we shouldn't be overly prescriptive here.
Factoring things out at this point is premature.
Bruce
>
> > +IMAGE_INSTALL += "ncurses-terminfo-base"
> > +IMAGE_INSTALL += "python3 coreutils"
> > +IMAGE_INSTALL += "${@bb.utils.contains('PACKAGECONFIG', 'dev',
> 'python3-pip', '', d)}"
> > +
> > +# Allow build with or without a specific kernel
> > +IMAGE_CONTAINER_NO_DUMMY = "1"
> > +
> > +# Note: No ROOTFS_POSTPROCESS_COMMAND needed - IMAGE_ROOTFS is empty
> > +# and PM handles installation directly to OCI layers
>
> Best regards,
>
> --
> Paul Barker
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#9842):
> https://lists.yoctoproject.org/g/meta-virtualization/message/9842
> Mute This Topic: https://lists.yoctoproject.org/mt/119557386/1050810
> Group Owner: meta-virtualization+owner@lists.yoctoproject.org
> Unsubscribe: https://lists.yoctoproject.org/g/meta-virtualization/unsub [
> bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
--
- Thou shalt not follow the NULL pointer, for chaos and madness await thee
at its end
- "Use the force Harry" - Gandalf, Star Trek II
[-- Attachment #2: Type: text/html, Size: 9182 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-virtualization][PATCH 0/7] Container improvements
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
` (6 preceding siblings ...)
2026-05-30 1:31 ` [meta-virtualization][PATCH 7/7] app-container-curl: use multilayer mode; container-nonroot-user Tim Orling
@ 2026-06-05 3:31 ` Bruce Ashfield
7 siblings, 0 replies; 11+ messages in thread
From: Bruce Ashfield @ 2026-06-05 3:31 UTC (permalink / raw)
To: ticotimo; +Cc: meta-virtualization
Just ack'ing the series.
I'm working through issues with the recipe bumps right now, but
will get to this shortly and have a closer look.
Bruce
In message: [meta-virtualization][PATCH 0/7] Container improvements
on 29/05/2026 Tim Orling via lists.yoctoproject.org wrote:
> This series:
> * Adds a class to create/run containers with a non-root user
> * Adds new containers:
> - app-container-python
> - app-containter-mosquitto
> - app-container-valkey
> - app-container-nginx
> * Modifies app-container-curl to be more like the upstream
> experience (and more like the above containers)
> * Allows meta-webserver/recipes-http to be parsed for
> vcontainer distro so we can build multiarch containers
> for app-container-nginx, etc.
>
> Each of these containers was built in a MACHINE=qemuarm64
> environment as well as mc:container-amd64+mc:container-arm64
> multiarch environment.
>
> The resulting containers were tested with simple command line
> usage compared to Docker provided equivalents to ensure the
> same expected behavior.
>
> Tim Orling (7):
> classes: add container-nonroot-user.bbclass
> recipes-containers/images: add app-container-python
> recipes-containers/images: add app-container-mosquitto
> recipes-containers/images: add app-container-valkey
> recipes-containers/images: add app-container-nginx
> vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd
> app-container-curl: use multilayer mode; container-nonroot-user
>
> classes/container-nonroot-user.bbclass | 68 ++++++++++++++++
> conf/distro/include/vcontainer-bbmask.inc | 2 +-
> conf/layer.conf | 1 +
> .../images/app-container-curl.bb | 29 ++++++-
> .../images/app-container-mosquitto.bb | 46 +++++++++++
> .../images/app-container-nginx.bb | 77 +++++++++++++++++++
> .../images/app-container-python.bb | 57 ++++++++++++++
> .../images/app-container-valkey.bb | 61 +++++++++++++++
> 8 files changed, 336 insertions(+), 5 deletions(-)
> create mode 100644 classes/container-nonroot-user.bbclass
> rename {recipes-demo => recipes-containers}/images/app-container-curl.bb (58%)
> create mode 100644 recipes-containers/images/app-container-mosquitto.bb
> create mode 100644 recipes-containers/images/app-container-nginx.bb
> create mode 100644 recipes-containers/images/app-container-python.bb
> create mode 100644 recipes-containers/images/app-container-valkey.bb
>
> --
> 2.54.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#9826): https://lists.yoctoproject.org/g/meta-virtualization/message/9826
> Mute This Topic: https://lists.yoctoproject.org/mt/119557384/1050810
> Group Owner: meta-virtualization+owner@lists.yoctoproject.org
> Unsubscribe: https://lists.yoctoproject.org/g/meta-virtualization/unsub [bruce.ashfield@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-06-05 3:31 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-30 1:31 [meta-virtualization][PATCH 0/7] Container improvements Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 1/7] classes: add container-nonroot-user.bbclass Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 2/7] recipes-containers/images: add app-container-python Tim Orling
2026-06-02 10:01 ` Paul Barker
2026-06-02 12:02 ` Bruce Ashfield
2026-05-30 1:31 ` [meta-virtualization][PATCH 3/7] recipes-containers/images: add app-container-mosquitto Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 4/7] recipes-containers/images: add app-container-valkey Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 5/7] recipes-containers/images: add app-container-nginx Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 6/7] vcontainer-bbmask.inc: allow meta-webserver/recipes-httpd Tim Orling
2026-05-30 1:31 ` [meta-virtualization][PATCH 7/7] app-container-curl: use multilayer mode; container-nonroot-user Tim Orling
2026-06-05 3:31 ` [meta-virtualization][PATCH 0/7] Container improvements Bruce Ashfield
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.