镜像构建历史
# 2026-10-25 17:03:16 0.00B 设置默认要执行的命令
CMD ["/hermeswebui_init.bash"]
# 2026-10-25 17:03:16 0.00B 指定运行容器时使用的用户
USER root
# 2026-10-25 17:03:16 0.00B 指定检查容器健康状态的命令
HEALTHCHECK {Test:[CMD-SHELL bash /apptoo/scripts/lib/health_probe.sh localhost 8787 /health 2 >/dev/null || exit 1] Interval:30s Timeout:8s StartPeriod:10s StartInterval:0s Retries:3}
# 2026-10-25 17:03:16 0.00B 声明容器运行时监听的端口
EXPOSE [8787/tcp]
# 2026-10-25 17:03:16 0.00B 设置环境变量 HERMES_WEBUI_PORT
ENV HERMES_WEBUI_PORT=8787
# 2026-10-25 17:03:16 0.00B 设置环境变量 HERMES_WEBUI_HOST
ENV HERMES_WEBUI_HOST=0.0.0.0
# 2026-10-25 17:03:16 26.00B 执行命令并创建新的镜像层
RUN |5 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 HERMES_VERSION=v0.52.544 /bin/sh -c echo "__version__ = '${HERMES_VERSION}'" > /apptoo/api/_version.py # buildkit
# 2026-10-25 17:03:16 0.00B 定义构建参数
ARG HERMES_VERSION=v0.52.544
# 2026-10-25 17:03:16 38.82MB 复制新文件或目录到容器中
COPY --chown=root:root . /apptoo # buildkit
# 2026-10-25 17:03:16 37.93MB 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh # buildkit
# 2026-10-25 17:03:16 0.00B 指定运行容器时使用的用户
USER root
# 2026-10-25 17:03:16 0.00B 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c rm -rf /var/lib/apt/lists/* /etc/apt/apt.conf.d/01proxy && apt-get clean # buildkit
# 2026-10-25 17:03:15 0.00B 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c touch /.within_container # buildkit
# 2026-10-25 17:03:15 40.82KB 复制新文件或目录到容器中
COPY --chmod=555 docker_init.bash /hermeswebui_init.bash # buildkit
# 2026-10-25 17:03:15 9.05KB 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c groupadd -g 1024 hermeswebui && useradd -u 1024 -d /home/hermeswebui -g hermeswebui -G users -s /bin/bash -m hermeswebui && mkdir -p /app /uv_cache /workspace && chown -R hermeswebui:hermeswebui /home/hermeswebui /app /uv_cache /workspace && chmod 0755 /home/hermeswebui && chmod 1777 /app /uv_cache /workspace # buildkit
# 2026-10-25 17:03:15 0.00B 设置工作目录为/apptoo
WORKDIR /apptoo
# 2026-10-25 17:03:15 0.00B 设置环境变量 PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED PYTHONIOENCODING
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PYTHONIOENCODING=utf-8
# 2026-10-25 17:03:15 0.00B 设置环境变量 LC_ALL
ENV LC_ALL=C
# 2026-10-25 17:03:15 0.00B 设置环境变量 LANG
ENV LANG=en_US.utf8
# 2026-10-25 17:03:15 3.06MB 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 # buildkit
# 2026-10-25 17:03:14 0.00B 执行命令并创建新的镜像层
RUN |4 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a INSTALL_GPU_LIBS=0 /bin/sh -c if [ "$INSTALL_GPU_LIBS" = "1" ]; then apt-get update -y --fix-missing --no-install-recommends && apt-get install -y --no-install-recommends libva2 vainfo mesa-va-drivers && if apt-cache show intel-media-va-driver-non-free >/dev/null 2>&1; then apt-get install -y --no-install-recommends intel-media-va-driver-non-free; else echo "intel-media-va-driver-non-free is not available from the configured Debian repositories; skipping Intel non-free VA-API driver."; fi && apt-get clean && rm -rf /var/lib/apt/lists/*; else echo "Skipping optional GPU user-space acceleration libraries (INSTALL_GPU_LIBS=0)."; fi # buildkit
# 2026-10-25 17:03:14 0.00B 定义构建参数
ARG INSTALL_GPU_LIBS=0
# 2026-10-25 17:03:14 16.83MB 执行命令并创建新的镜像层
RUN |3 SQLITE_VERSION=3530000 SQLITE_YEAR=2026 SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a /bin/sh -c apt-get update && apt-get install -y --no-install-recommends gcc make libc6-dev && cd /tmp && curl -fsSL "https://sqlite.org/${SQLITE_YEAR}/sqlite-autoconf-${SQLITE_VERSION}.tar.gz" -o sqlite.tar.gz && echo "${SQLITE_SHA256} sqlite.tar.gz" | sha256sum -c - && tar xzf sqlite.tar.gz && cd "sqlite-autoconf-${SQLITE_VERSION}" && CPPFLAGS="-DSQLITE_SECURE_DELETE" ./configure --prefix=/usr/local --disable-static --disable-readline --enable-fts5 --enable-fts4 --enable-rtree && make -j"$(nproc)" && make install && echo "/usr/local/lib" > /etc/ld.so.conf.d/000-usr-local-lib.conf && /sbin/ldconfig && cd / && rm -rf /tmp/sqlite* && apt-get purge -y gcc make libc6-dev && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* && python3 -c "import sqlite3; v = sqlite3.sqlite_version; assert tuple(int(x) for x in v.split('.')) >= (3, 51, 3), f'SQLite {v} still vulnerable'; c = sqlite3.connect(':memory:'); assert c.execute('PRAGMA secure_delete').fetchone()[0] == 1, 'SQLITE_SECURE_DELETE not compiled in (deleted rows would remain recoverable)'; c.execute('CREATE VIRTUAL TABLE _fts5_build_check USING fts5(x)'); c.execute('DROP TABLE _fts5_build_check'); c.close()" # buildkit
# 2026-10-25 17:02:09 0.00B 定义构建参数
ARG SQLITE_SHA256=851e9b38192fe2ceaa65e0baa665e7fa06230c3d9bd1a6a9662d02380d73365a
# 2026-10-25 17:02:09 0.00B 定义构建参数
ARG SQLITE_YEAR=2026
# 2026-10-25 17:02:09 0.00B 定义构建参数
ARG SQLITE_VERSION=3530000
# 2026-10-25 17:02:09 117.92MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update -y --fix-missing --no-install-recommends && apt-get install -y --no-install-recommends apt-utils locales ca-certificates curl rsync openssh-client git xz-utils && apt-get upgrade -y && apt-get clean && rm -rf /var/lib/apt/lists/* # buildkit
# 2026-10-25 17:02:00 15.26MB 执行命令并创建新的镜像层
RUN /bin/sh -c 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 # buildkit
# 2026-10-25 17:02:00 0.00B 设置环境变量 DEBIAN_FRONTEND
ENV DEBIAN_FRONTEND=noninteractive
# 2026-10-25 17:02:00 0.00B 添加元数据标签
LABEL description=Hermes Web UI — browser interface for Hermes Agent
# 2026-10-25 17:02:00 0.00B 添加元数据标签
LABEL maintainer=nesquena
# 2026-10-21 09:10:54 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-10-21 09:10:54 36.00B 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; for src in idle3 pip3 pydoc3 python3 python3-config; do dst="$(echo "$src" | tr -d 3)"; [ -s "/usr/local/bin/$src" ]; [ ! -e "/usr/local/bin/$dst" ]; ln -svT "$src" "/usr/local/bin/$dst"; done # buildkit
# 2026-10-21 09:10:53 36.81MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends dpkg-dev g++ gcc gnupg libbluetooth-dev libbz2-dev libc6-dev libdb-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev make tk-dev uuid-dev wget xz-utils zlib1g-dev ; wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; echo "$PYTHON_SHA256 *python.tar.xz" | sha256sum -c -; wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; gpg --batch --verify python.tar.xz.asc python.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME" python.tar.xz.asc; mkdir -p /usr/src/python; tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; rm python.tar.xz; cd /usr/src/python; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; ./configure --build="$gnuArch" --enable-loadable-sqlite-extensions --enable-optimizations --enable-option-checking=fatal --enable-shared $(test "${gnuArch%%-*}" != 'riscv64' && echo '--with-lto') --with-ensurepip ; nproc="$(nproc)"; EXTRA_CFLAGS="$(dpkg-buildflags --get CFLAGS)"; LDFLAGS="$(dpkg-buildflags --get LDFLAGS)"; LDFLAGS="${LDFLAGS:-} -Wl,--strip-all"; arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; case "$arch" in amd64|arm64) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"; ;; i386) ;; *) EXTRA_CFLAGS="${EXTRA_CFLAGS:-} -fno-omit-frame-pointer"; ;; esac; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-}" ; rm python; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-} -Wl,-rpath='\$\$ORIGIN/../lib'" python ; make install; cd /; rm -rf /usr/src/python; find /usr/local -depth \( \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \) -exec rm -rf '{}' + ; ldconfig; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark; find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' | sort -u | xargs -rt dpkg-query --search | awk 'sub(":$", "", $1) { print $1 }' | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; apt-get dist-clean; export PYTHONDONTWRITEBYTECODE=1; python3 --version; pip3 --version # buildkit
# 2026-10-21 09:01:09 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=c2c4321961fab0fb999d66e0cecf521c2ab3994c7992873ea99e306c1094fd5a
# 2026-10-21 09:01:09 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.12.15
# 2026-10-21 09:01:09 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305
# 2026-10-21 09:01:09 3.81MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates netbase tzdata ; apt-get dist-clean # buildkit
# 2026-10-21 09:01:09 0.00B 设置环境变量 LANG
ENV LANG=C.UTF-8
# 2026-10-21 09:01:09 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-10-21 05:32:55 78.82MB
# debian.sh --arch 'amd64' out/ 'trixie' '@1792531975'
镜像信息
{
"Id": "sha256:cf65bfded45204ef224a108b5e77c765b4486fc8dd0d5748eb9bd6ebacb9ac42",
"RepoTags": [
"ghcr.io/nesquena/hermes-webui:0.52.544",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/nesquena/hermes-webui:0.52.544"
],
"RepoDigests": [
"ghcr.io/nesquena/hermes-webui@sha256:03e6d1dc9ebabbb53a6b270dc11395db00146f63e76ec8f51686f1e89a0be0a4",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/nesquena/hermes-webui@sha256:02c3d7338ce6ed0af184542c7c49ce7485a776d6b1d6be1f467e6aa87443d080"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-10-25T09:03:16.812762997Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "root",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8787/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=en_US.utf8",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.12.15",
"PYTHON_SHA256=c2c4321961fab0fb999d66e0cecf521c2ab3994c7992873ea99e306c1094fd5a",
"DEBIAN_FRONTEND=noninteractive",
"LC_ALL=C",
"PYTHONDONTWRITEBYTECODE=1",
"PYTHONUNBUFFERED=1",
"PYTHONIOENCODING=utf-8",
"HERMES_WEBUI_HOST=0.0.0.0",
"HERMES_WEBUI_PORT=8787"
],
"Cmd": [
"/hermeswebui_init.bash"
],
"Healthcheck": {
"Test": [
"CMD-SHELL",
"bash /apptoo/scripts/lib/health_probe.sh localhost 8787 /health 2 \u003e/dev/null || exit 1"
],
"Interval": 30000000000,
"Timeout": 8000000000,
"StartPeriod": 10000000000,
"Retries": 3
},
"ArgsEscaped": true,
"Image": "",
"Volumes": null,
"WorkingDir": "/apptoo",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"description": "Hermes Web UI — browser interface for Hermes Agent",
"maintainer": "nesquena",
"org.opencontainers.image.created": "2026-10-25T09:01:52.404Z",
"org.opencontainers.image.description": "Hermes WebUI: The best way to use Hermes Agent from the web or from your phone!",
"org.opencontainers.image.licenses": "MIT",
"org.opencontainers.image.revision": "687d80333870c3797d6858738621fca13d1bf27a",
"org.opencontainers.image.source": "https://github.com/nesquena/hermes-webui",
"org.opencontainers.image.title": "hermes-webui",
"org.opencontainers.image.url": "https://github.com/nesquena/hermes-webui",
"org.opencontainers.image.version": "0.52.544"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 349312644,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/18ce49974c08bf87be75be849460895872958aef6729785bc0870f30c20038c1/diff:/var/lib/docker/overlay2/5d975b7e32bb9ae90de17c18553e79d01794499d0438dbcfcc8c9cafdbed038c/diff:/var/lib/docker/overlay2/2e986f86cbc6f9134ec6cab0b7358203ec6bebdff04f19a385aec6808e573ba9/diff:/var/lib/docker/overlay2/c9260fc6a030fe3247768086a491a8ffdaec2400c3a266c4b70993c7f2fbf414/diff:/var/lib/docker/overlay2/c7eb0efa76ac3017ba85a17cb146d3c11064260784f7e527e1ab758130c73384/diff:/var/lib/docker/overlay2/54a440b09521078c01ca49bae3620b61d3433aa029e9b855e063fd86482d5826/diff:/var/lib/docker/overlay2/7ee24411d885265f31ce982b1e8a237b43971c1793a0d922e08d67b543d7b43e/diff:/var/lib/docker/overlay2/d5bc8f153091cf516e9bc905820dc016de78ea72648bcbce17e56949d49bb6f6/diff:/var/lib/docker/overlay2/7d2e091765d7dd654ad613de731285ce0f3f836ae3ba73bef1a412cee555df76/diff:/var/lib/docker/overlay2/e964d450aaf45af7ecaf5f486cbb75d24669b5d79d12a525181fbb82f3a307ac/diff:/var/lib/docker/overlay2/0a3c642968613bc3570f066fdad9ace0ac9e89f1e5565d5f29f532acc0af40e7/diff:/var/lib/docker/overlay2/929968633b1c0d0ccd7d319c715dbb64bfb4c048c1ebb43ef0fd12f5207f9ca7/diff:/var/lib/docker/overlay2/03d9883bfbee6ab0dd3f48c6f9638173a517d653034d95859dffe127156aee1d/diff:/var/lib/docker/overlay2/457ca872f8a6124861e6ca50bb0e0d33128be138614c6b56afac9b9a50479013/diff:/var/lib/docker/overlay2/efa3d7abb3d6e7721bdc75659fcfae8218fc8f653c31426fb37ae6ec73a4bd8a/diff:/var/lib/docker/overlay2/6acc637907c89b13f6c7e6cb980b844c1d498eb55c1eefb356b50549fe706a10/diff",
"MergedDir": "/var/lib/docker/overlay2/3cfbf11e5a73c5f4a9d82b7bade9d2237847d37b2df673e401c0a6cad61840e9/merged",
"UpperDir": "/var/lib/docker/overlay2/3cfbf11e5a73c5f4a9d82b7bade9d2237847d37b2df673e401c0a6cad61840e9/diff",
"WorkDir": "/var/lib/docker/overlay2/3cfbf11e5a73c5f4a9d82b7bade9d2237847d37b2df673e401c0a6cad61840e9/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:a70f6272827f64e1427d048ced77491aab5d64ab95725e56920802ff391197d7",
"sha256:33d3a946838548b1885b1068b960a88e41537b6996342c8fc2c767a6879e62f4",
"sha256:500ecb68a701ad0437ae759f35178f2ddbc48e10a0bc6dc345548054f737df6a",
"sha256:93881a54803b57e0039f40fd78de98b41b69b55d025c431544788fd84f0904cd",
"sha256:a3e7c018438221f7cd1809e1a64de3948525802d9616a6f26a10b3d8ff1c465b",
"sha256:96941d2ec6de8591f7917a9c73bb434b1fd18977ad323c9b95ebd53a198b6b80",
"sha256:d4f74ce624d2e53a31d834eee5096b69820c9930ff6cec95fed105697b9dd05f",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:1ee86745a8c25af3140edcabb0c0a8d78c4000d3fb147c515737e03f0642f5f0",
"sha256:a00188c6219b840e2900ff49aa75fdaa4790e981504639fc2487d130b3a238e4",
"sha256:587f6cc018ac8c1fbbf45b1d7bba2923c4ccfe860082a6d3101362c33e4ade14",
"sha256:8a61e707e59def9ebe113d163d97f0954d5bd4db613be24aae538f58958ca349",
"sha256:b408434dcb10fc70e6081e4a08c286b690a0f5f9aa3426fab883986b4473f509",
"sha256:af4523aac709803721d555715535f5d433956b755e4ca872f8b2fd6b231dc261",
"sha256:4452983952e876f490a01203d54c1aff4f9fdd68089da245a891361677940f27",
"sha256:8f5a8ed10d13b089d64319bda6701ede3b798ffbd0ccb818fd5147096397947b",
"sha256:84e17071d94ba2050aa064cec73500e79025f46869b5da8b5cbed859c1ec2348"
]
},
"Metadata": {
"LastTagTime": "2026-10-29T14:50:44.983286204+08:00"
}
}