diff --git a/dankclaw/voiceservice/Containerfile.engine b/dankclaw/voiceservice/Containerfile.engine index 932a096..4efc980 100644 --- a/dankclaw/voiceservice/Containerfile.engine +++ b/dankclaw/voiceservice/Containerfile.engine @@ -110,7 +110,16 @@ RUN apt-get update -qq \ # Same unprivileged uid as the frank-tts façade (10000): the voice packs and the # model directory are host state mounted read-only, and one uid across the pair # means one thing to remember about what is world-readable. -RUN adduser --system --uid 10000 --home /app --shell /usr/sbin/nologin tts +# +# `useradd`, NOT `adduser`: this trimmed ubuntu:24.04 base ships no `adduser` at +# all (verified 2026-10-18 against this digest — `adduser` is absent from the +# base and is not pulled in by ca-certificates/curl/libgomp1 either), so an +# `adduser` line dies at image-build time with crun's "executable file `adduser` +# not found in $PATH". `useradd --system --uid 10000` succeeds and prints one +# cosmetic warning (`uid 10000 is greater than SYS_UID_MAX 999`); the uid is the +# point, and it is what matches the façade. The alpine façade Containerfile keeps +# its own busybox `adduser -D -u 10000` — different base, different tool, same uid. +RUN useradd --system --uid 10000 --home-dir /app --shell /usr/sbin/nologin tts WORKDIR /app COPY --from=build /src/build/tts-server /src/build/*.so* /app/