feat: add sidefx labs by default in the image

This commit is contained in:
Simon Lambin
2026-09-12 13:19:16 +02:00
parent 829f0a503c
commit 7075959827
3 changed files with 87 additions and 1 deletions

View File

@@ -38,6 +38,55 @@ to read this — it's implementation reasoning, not usage docs (those are in
and symlinks it to `/opt/hfs` itself, so `houdini-run` and the
`/etc/profile.d` snippet don't need to know the exact version.
## SideFX Labs — baked in, not installed at runtime
Simon hit `No such file or directory` using Houdini's own in-app package
installer for Labs. Root cause (confirmed, not guessed): this image never
installed `ca-certificates`, so any HTTPS download from inside the container
fails TLS verification — reproduced directly with `wget` against
`github.com` inside a test build (`wget` exit 5, "cannot verify github.com's
certificate"). The in-app installer's `No such file or directory` is almost
certainly it shelling out to `git` (also never installed) for the same
underlying reason: no working way to fetch anything over HTTPS. `wget` was
already installed and used fine elsewhere in this Dockerfile, so the gap was
specifically the missing CA bundle, not a missing downloader. Fixed by
adding `ca-certificates` to the apt-get install list (`base` stage).
Rather than also install `git` and instruct Simon to run the in-app
installer, Labs is fetched and baked in at build time:
- Downloaded from a GitHub **release tag**
(`https://github.com/sideeffects/SideFXLabs/archive/refs/tags/<tag>.tar.gz`),
pinned via `ARG SIDEFXLABS_VERSION`, same pattern as `HOUDINI_EULA_DATE` —
unpinned upstream, pick the newest tag whose `target_commitish` is
`Development` and whose bundled `SideFXLabs.json` `enable` range covers
this image's Houdini version. Checked via the GitHub releases API at
writing time: tag `22.0.440` declares
`"enable": "houdini_version >= '22.0' and houdini_version < '22.5'"`,
which covers this image's `22.0.429`.
- Extracted straight into **`$HFS/packages/SideFXLabs22.0/`**, with the
vendored `SideFXLabs.json` copied up to `$HFS/packages/SideFXLabs22.0.json`
unmodified. This location was not a guess: `$HFS/packages` is where
Houdini's *own* shipped optional packages already live (confirmed by
listing the real installed tree in a test build — `apex`, `kinefx`,
`ocio`, `sculpt`, `shotbuilder`, `texturepaint` all follow the exact same
`<name>.json` + `<name>/` pattern there). It's also documented as a
package search path independent of `$HOME`
(https://www.sidefx.com/docs/houdini/ref/plugins.html), which matters
specifically because distrobox bind-mounts the host's `$HOME` over
whatever the image ships under `$HOUDINI_USER_PREF_DIR` — anything baked
in there would be invisible at runtime. No edits to the vendored JSON were
needed: its default `"$HOUDINI_PACKAGE_PATH/SideFXLabs22.0"` already
resolves correctly, since `HOUDINI_PACKAGE_PATH` just means "the directory
this json file itself lives in".
- Verified end-to-end in a real build: `ca-certificates` fix lets `wget`
fetch the release tarball; extracted tree has 452 `.hda` files under
`otls/`; `$HFS/packages/SideFXLabs22.0.json` present and well-formed.
**Not** verified against a real license + GUI launch (Apprentice
activation needs a real SideFX login, out of scope for this check) — the
Labs menu actually appearing in a running Houdini session is unconfirmed,
though the mechanism matches Houdini's own shipped packages exactly.
## Runtime library list
SideFX's own package list in `docker/Ubuntu/Dockerfile` is built for headless
@@ -155,6 +204,7 @@ Everything below was confirmed with an actual build + an actual
| GUI rendering via XWayland (Hyprland host) | High | Confirmed real AMD hardware acceleration (`glxinfo`: direct rendering, AMD Radeon Vega renderer, not llvmpipe). First launch was slow (container's first-run package install + cold start); later launches fluid. |
| AMD OpenCL (sims) | Low | Not set up; needs ROCm/rusticl. GL/Vulkan viewport is unaffected. |
| NVIDIA variant | Untested | Builds fine (same base, no extra packages), but never run against real NVIDIA hardware — only the `amd` target has been used end to end. |
| SideFX Labs baked into `$HFS/packages` | Medium | Build-time fetch + extraction confirmed (452 `.hda`s, well-formed json), and the target path matches Houdini's own shipped packages exactly — but never confirmed against a real license + GUI launch that the Labs menu actually appears. |
## Repo-wide conventions

View File

@@ -12,9 +12,13 @@ ARG HOUDINI_TARBALL=houdini-linux.tar.gz
# unrelated houdini_installer launcher tool). Current EULA date: 2021-10-13,
# see https://www.sidefx.com/legal/license-agreement/
ARG HOUDINI_EULA_DATE=2021-10-13
# Github release tag at https://github.com/sideeffects/SideFXLabs/releases —
# pick the newest tag whose target branch is "Development" and whose bundled
# SideFXLabs.json "enable" range covers this image's Houdini version.
ARG SIDEFXLABS_VERSION=22.0.440
RUN apt-get update && apt-get install -y --no-install-recommends \
sudo procps \
sudo procps ca-certificates \
bc fontconfig wget libasound2 libgl1 libglu1 libglu1-mesa libglx0 \
libegl1 libatomic1 libxkbfile1 libxcb-cursor0 \
libice6 libnss3 libopengl0 libpci3 libsm6 libx11-6 libx11-xcb1 \
@@ -43,6 +47,27 @@ RUN chmod +x /usr/local/bin/houdini-run && \
printf 'if [ -d /opt/hfs ]; then _p="$PWD"; cd /opt/hfs && . ./houdini_setup >/dev/null 2>&1; cd "$_p"; fi\n' \
> /etc/profile.d/houdini.sh
# SideFX Labs, baked in rather than installed through Houdini's own in-app
# package installer. That installer writes into $HOUDINI_USER_PREF_DIR
# (under $HOME), which distrobox bind-mounts from the host over whatever the
# image ships there — so anything baked in under $HOME would just be
# shadowed at runtime, and doing it live means every container needs its own
# git-clone/download at first launch (this is also almost certainly the
# actual source of the "no such file or directory": the installer shells out
# to `git`, which this image never installed).
# $HFS/packages is a package-search path Houdini scans unconditionally,
# independent of $HOME (see `houdini/ref/plugins.html` in SideFX's docs), so
# drop the official package descriptor + the Labs tree there untouched: the
# descriptor's default `$HOUDINI_PACKAGE_PATH/SideFXLabs22.0` already
# resolves correctly since HOUDINI_PACKAGE_PATH is just "wherever this json
# file lives".
RUN mkdir -p /opt/hfs/packages/SideFXLabs22.0 && \
wget -qO /tmp/sidefxlabs.tar.gz \
"https://github.com/sideeffects/SideFXLabs/archive/refs/tags/${SIDEFXLABS_VERSION}.tar.gz" && \
tar xzf /tmp/sidefxlabs.tar.gz --strip-components=1 -C /opt/hfs/packages/SideFXLabs22.0 && \
cp /opt/hfs/packages/SideFXLabs22.0/SideFXLabs.json /opt/hfs/packages/SideFXLabs22.0.json && \
rm /tmp/sidefxlabs.tar.gz
FROM base AS amd
RUN apt-get update && apt-get install -y --no-install-recommends \
libgl1-mesa-dri libglx-mesa0 mesa-vulkan-drivers && \

View File

@@ -1,5 +1,10 @@
# Houdini Apprentice in distrobox
SideFX Labs is baked into the image at build time (see `SIDEFXLABS_VERSION`
below) — no need to install it from Houdini's own package menu, which needs
`git` and a working CA bundle that this image doesn't ship. The Labs menu
should just appear in Houdini's menu bar on first launch.
Two images built from the same `Dockerfile`, pushed to a private registry,
used via distrobox:
@@ -32,11 +37,16 @@ TARBALL=houdini-22.0.429-linux_x86_64_gcc14.2.tar.gz
# Date the EULA at https://www.sidefx.com/legal/license-agreement/ was last
# updated, format YYYY-MM-DD, no "SideFX-" prefix.
EULA_DATE=2021-10-13
# Release tag at https://github.com/sideeffects/SideFXLabs/releases — pick
# the newest tag whose bundled SideFXLabs.json "enable" range covers your
# Houdini version (default below already matches 22.0.429).
SIDEFXLABS_VERSION=22.0.440
# Build amd image
podman build -f Dockerfile \
--build-arg "HOUDINI_TARBALL=${TARBALL}" \
--build-arg "HOUDINI_EULA_DATE=${EULA_DATE}" \
--build-arg "SIDEFXLABS_VERSION=${SIDEFXLABS_VERSION}" \
--target "amd" \
-t "${REGISTRY}/houdini-amd:${VERSION}" \
-t "${REGISTRY}/houdini-amd:latest" .
@@ -45,6 +55,7 @@ podman build -f Dockerfile \
podman build -f Dockerfile \
--build-arg "HOUDINI_TARBALL=${TARBALL}" \
--build-arg "HOUDINI_EULA_DATE=${EULA_DATE}" \
--build-arg "SIDEFXLABS_VERSION=${SIDEFXLABS_VERSION}" \
--target "nvidia" \
-t "${REGISTRY}/houdini-nvidia:${VERSION}" \
-t "${REGISTRY}/houdini-nvidia:latest" .