* fix: pre-install uv in Docker image + fix workspace dir permissions (#357) Two fixes for Docker startup reliability: 1. Install uv at build time in the Dockerfile so the container works without internet access at runtime. The init script now skips the download when uv is already on PATH. 2. Use sudo mkdir/chown for the workspace directory, matching the pattern used for /app. Docker auto-creates bind-mount directories as root, leaving them unwritable by the hermeswebui user. Fixes #357 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: Docker uv pre-install as root to /usr/local/bin + tests + CHANGELOG Dockerfile: install uv as root with UV_INSTALL_DIR=/usr/local/bin so it lands in /usr/local/bin (system PATH) rather than /home/hermeswebuitoo/.local/bin which the hermeswebui runtime user can't see. tests/test_issue357.py: 15 structural tests covering Dockerfile uv build-time install (system-wide, as root, before COPY), init script skip-if-present logic, and workspace sudo mkdir/chown. CHANGELOG.md: v0.50.17 entry; 915 tests (up from 900) --------- Co-authored-by: Nathan Esquenazi <nesquena@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
89 lines
2.7 KiB
Docker
89 lines
2.7 KiB
Docker
FROM python:3.12-slim
|
|
|
|
LABEL maintainer="nesquena"
|
|
LABEL description="Hermes Web UI — browser interface for Hermes Agent"
|
|
|
|
# Install system packages
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
# Make use of apt-cacher-ng if available
|
|
RUN if [ "A${BUILD_APT_PROXY:-}" != "A" ]; then \
|
|
echo "Using APT proxy: ${BUILD_APT_PROXY}"; \
|
|
printf 'Acquire::http::Proxy "%s";\n' "$BUILD_APT_PROXY" > /etc/apt/apt.conf.d/01proxy; \
|
|
fi \
|
|
&& apt-get update \
|
|
&& apt-get install -y --no-install-recommends ca-certificates wget gnupg \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& apt-get clean
|
|
|
|
RUN apt-get update -y --fix-missing --no-install-recommends \
|
|
&& apt-get install -y --no-install-recommends \
|
|
apt-utils \
|
|
locales \
|
|
ca-certificates \
|
|
sudo \
|
|
curl \
|
|
rsync \
|
|
&& apt-get upgrade -y \
|
|
&& apt-get clean \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# UTF-8
|
|
RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
|
|
ENV LANG=en_US.utf8
|
|
ENV LC_ALL=C
|
|
|
|
# Set environment variables
|
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONIOENCODING=utf-8
|
|
|
|
WORKDIR /apptoo
|
|
|
|
# Every sudo group user does not need a password
|
|
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
|
|
|
|
# Create a new group for the hermeswebui and hermeswebuitoo users
|
|
RUN groupadd -g 1024 hermeswebui \
|
|
&& groupadd -g 1025 hermeswebuitoo
|
|
|
|
# The hermeswebui (resp. hermeswebuitoo) user will have UID 1024 (resp. 1025),
|
|
# be part of the hermeswebui (resp. hermeswebuitoo) and users groups and be sudo capable (passwordless)
|
|
RUN useradd -u 1024 -d /home/hermeswebui -g hermeswebui -s /bin/bash -m hermeswebui \
|
|
&& usermod -G users hermeswebui \
|
|
&& adduser hermeswebui sudo
|
|
RUN useradd -u 1025 -d /home/hermeswebuitoo -g hermeswebuitoo -s /bin/bash -m hermeswebuitoo \
|
|
&& usermod -G users hermeswebuitoo \
|
|
&& adduser hermeswebuitoo sudo
|
|
RUN chown -R hermeswebuitoo:hermeswebuitoo /apptoo
|
|
|
|
USER root
|
|
|
|
COPY --chmod=555 docker_init.bash /hermeswebui_init.bash
|
|
|
|
RUN touch /.within_container
|
|
|
|
# Remove APT proxy configuration and clean up APT downloaded files
|
|
RUN rm -rf /var/lib/apt/lists/* /etc/apt/apt.conf.d/01proxy \
|
|
&& apt-get clean
|
|
|
|
USER root
|
|
|
|
# Pre-install uv system-wide so the container doesn't need internet access at runtime.
|
|
# Installing as root places uv in /usr/local/bin, available to all users.
|
|
# The init script will skip the download when uv is already on PATH.
|
|
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
|
|
|
|
USER hermeswebuitoo
|
|
|
|
COPY . /apptoo
|
|
|
|
# Default to binding all interfaces (required for container networking)
|
|
ENV HERMES_WEBUI_HOST=0.0.0.0
|
|
ENV HERMES_WEBUI_PORT=8787
|
|
|
|
EXPOSE 8787
|
|
|
|
CMD ["/hermeswebui_init.bash"]
|
|
|