镜像构建历史
# 2026-07-19 17:19:17 0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/app/entrypoint.sh"]
# 2026-07-19 17:19:17 0.00B 指定检查容器健康状态的命令
HEALTHCHECK {Test:[CMD-SHELL python /app/healthcheck.py] Interval:30s Timeout:10s StartPeriod:1m0s StartInterval:0s Retries:3}
# 2026-07-19 17:19:17 0.00B 声明容器运行时监听的端口
EXPOSE [3782/tcp 8001/tcp]
# 2026-07-19 17:19:17 358.00B 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /app/healthcheck.py <<'EOF'
from pathlib import Path
import json
import urllib.request
port = 8001
settings_path = Path("/app/data/user/settings/system.json")
try:
settings = json.loads(settings_path.read_text(encoding="utf-8"))
port = int(settings.get("backend_port") or port)
except Exception:
pass
urllib.request.urlopen(f"http://localhost:{port}/", timeout=5).close()
EOF # buildkit
# 2026-07-19 17:19:17 3.44KB 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/entrypoint.sh && chmod +x /app/entrypoint.sh # buildkit
# 2026-07-19 17:19:17 3.44KB 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /app/entrypoint.sh <<'EOF'
#!/bin/bash
set -e
echo "============================================"
echo "🚀 Starting DeepTutor"
echo "============================================"
export DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES=1
# Docker is JSON-driven. Ignore runtime env names even if the host or a stale
# Compose environment provides them; the entrypoint re-exports values from
# data/user/settings/*.json below.
for key in \
BACKEND_PORT \
FRONTEND_PORT \
NEXT_PUBLIC_API_BASE_EXTERNAL \
NEXT_PUBLIC_API_BASE \
CORS_ORIGIN \
CORS_ORIGINS \
DISABLE_SSL_VERIFY \
CHAT_ATTACHMENT_DIR \
AUTH_ENABLED \
NEXT_PUBLIC_AUTH_ENABLED \
AUTH_USERNAME \
AUTH_PASSWORD_HASH \
AUTH_TOKEN_EXPIRE_HOURS \
AUTH_COOKIE_SECURE \
POCKETBASE_URL \
POCKETBASE_PORT \
POCKETBASE_EXTERNAL_URL \
POCKETBASE_ADMIN_EMAIL \
POCKETBASE_ADMIN_PASSWORD \
DEEPTUTOR_API_BASE_URL \
DEEPTUTOR_AUTH_ENABLED; do
unset "$key"
done
# Initialize user data directories if empty
echo "📁 Checking data directories..."
echo " Ensuring runtime settings and workspace layout..."
python -c "
from pathlib import Path
from deeptutor.services.setup import init_user_directories
init_user_directories(Path('/app'))
" 2>/dev/null || echo " ⚠️ Directory initialization skipped (will be created on first use)"
# Idempotent: re-chown /app/data so the unprivileged `deeptutor` user (UID 1000)
# owns it. Cheap on no-op; the only first-start cost is one stat per file.
chown -R deeptutor:deeptutor /app/data 2>/dev/null || true
echo "⚙️ Loading runtime JSON settings..."
eval "$(python - <<'PY'
import shlex
from deeptutor.services.config import export_runtime_settings_to_env
for key, value in export_runtime_settings_to_env(overwrite=True).items():
print(f"export {key}={shlex.quote(str(value))}")
PY
)"
export BACKEND_PORT=${BACKEND_PORT:-8001}
export FRONTEND_PORT=${FRONTEND_PORT:-3782}
# DEEPTUTOR_API_BASE_URL and DEEPTUTOR_AUTH_ENABLED are exported by the
# export_runtime_settings_to_env eval above (see render_environment in
# deeptutor/services/config/runtime_settings.py). web/proxy.ts reads them at
# request time to rewrite /api/* and /ws/* to the backend and to gate the login
# redirect. Keeping them in the single JSON-backed exporter means the Docker and
# `deeptutor start` paths stay in sync.
echo "📌 API Base URL (proxy): ${DEEPTUTOR_API_BASE_URL:-http://localhost:${BACKEND_PORT}}"
echo "📌 Auth enabled: ${DEEPTUTOR_AUTH_ENABLED:-false}"
echo "📌 Backend Port: ${BACKEND_PORT}"
echo "📌 Frontend Port: ${FRONTEND_PORT}"
echo "============================================"
echo "📦 Configuration loaded from:"
echo " - data/user/settings/system.json"
echo " - data/user/settings/auth.json"
echo " - data/user/settings/integrations.json"
echo " - data/user/settings/model_catalog.json"
echo " - data/user/settings/main.yaml"
echo " - data/user/settings/agents.yaml"
echo "============================================"
# Hand off to supervisord as PID 1. The daemon-level config deliberately omits
# `user=` so supervisord inherits PID 1's UID and stays portable across rootful
# and rootless-keep-id runtimes; children drop to the deeptutor user via
# per-program `user=`. Full rationale lives next to the [supervisord] section
# in the build step that writes /etc/supervisor/supervisord.conf.
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
EOF # buildkit
# 2026-07-19 17:19:17 278.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/start-frontend.sh && chmod +x /app/start-frontend.sh # buildkit
# 2026-07-19 17:19:17 278.00B 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /app/start-frontend.sh <<'EOF'
#!/bin/bash
set -e
FRONTEND_PORT=${FRONTEND_PORT:-3782}
FRONTEND_HOST=${FRONTEND_HOST:-0.0.0.0}
echo "[Frontend] 🚀 Starting Next.js frontend on ${FRONTEND_HOST}:${FRONTEND_PORT}..."
export PORT=${FRONTEND_PORT}
export HOSTNAME=${FRONTEND_HOST}
exec node /app/web/server.js
EOF # buildkit
# 2026-07-19 17:19:16 1.04KB 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/start-backend.sh && chmod +x /app/start-backend.sh # buildkit
# 2026-07-19 17:19:16 1.04KB 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /app/start-backend.sh <<'EOF'
#!/bin/bash
set -e
BACKEND_PORT=${BACKEND_PORT:-8001}
BACKEND_HOST=${BACKEND_HOST:-0.0.0.0}
echo "[Backend] 🚀 Starting FastAPI backend on ${BACKEND_HOST}:${BACKEND_PORT}..."
# Run uvicorn directly - the application's logging system already handles:
# 1. Console output (visible in docker logs)
# 2. File logging to data/user/logs/ai_tutor_*.log
#
# BACKEND_HOST defaults to 0.0.0.0 (LAN-reachable, matches bridge-mode
# port publishing). Set BACKEND_HOST=127.0.0.1 when running with
# network_mode: host to keep the backend on loopback only.
#
# --ws-max-size: chat attachments travel base64 inside one WS message; derive
# the frame cap from the configured attachment policy (system.json) so uploads
# the policy allows are not severed by uvicorn's 16MB default.
WS_MAX_SIZE=$(python -c "from deeptutor.services.config import get_ws_max_size; print(get_ws_max_size())" 2>/dev/null || echo 16777216)
exec python -m uvicorn deeptutor.api.main:app --host ${BACKEND_HOST} --port ${BACKEND_PORT} --no-access-log --ws-max-size ${WS_MAX_SIZE}
EOF # buildkit
# 2026-07-19 17:19:16 548.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /etc/supervisor/conf.d/programs.conf # buildkit
# 2026-07-19 17:19:16 548.00B 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /etc/supervisor/conf.d/programs.conf <<'EOF'
[program:backend]
command=/bin/bash /app/start-backend.sh
directory=/app
user=deeptutor
autostart=true
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0
environment=PYTHONPATH="/app",PYTHONUNBUFFERED="1"
[program:frontend]
command=/bin/bash /app/start-frontend.sh
directory=/app/web
user=deeptutor
autostart=true
autorestart=true
startsecs=5
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/2
stderr_logfile_maxbytes=0
environment=NODE_ENV="production"
EOF # buildkit
# 2026-07-19 17:19:16 150.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /etc/supervisor/supervisord.conf # buildkit
# 2026-07-19 17:19:16 150.00B 执行命令并创建新的镜像层
RUN /bin/sh -c cat > /etc/supervisor/supervisord.conf <<'EOF'
[supervisord]
nodaemon=true
logfile=/dev/null
logfile_maxbytes=0
pidfile=/tmp/supervisord.pid
[include]
files = /etc/supervisor/conf.d/programs.conf
EOF # buildkit
# 2026-07-19 17:19:16 0.00B 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p /etc/supervisor/conf.d # buildkit
# 2026-07-19 17:19:16 25.64MB 执行命令并创建新的镜像层
RUN /bin/sh -c groupadd --system --gid 1000 deeptutor && useradd --system --uid 1000 --gid 1000 --no-create-home --shell /usr/sbin/nologin deeptutor && chown -R deeptutor:deeptutor /app/data /app/web/.next # buildkit
# 2026-07-19 17:19:14 0.00B 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p data/user/settings data/memory data/user/workspace/memory data/user/workspace/notebook data/user/workspace/co-writer/audio data/user/workspace/co-writer/tool_calls data/user/workspace/chat/chat data/user/workspace/chat/deep_solve data/user/workspace/chat/deep_question data/user/workspace/chat/deep_research/reports data/user/workspace/chat/math_animator data/user/workspace/chat/_detached_code_execution data/user/logs data/knowledge_bases # buildkit
# 2026-07-19 17:19:14 1.02KB 复制新文件或目录到容器中
COPY requirements.txt ./ # buildkit
# 2026-07-19 17:19:14 7.00KB 复制新文件或目录到容器中
COPY requirements/ ./requirements/ # buildkit
# 2026-07-19 17:19:14 15.85KB 复制新文件或目录到容器中
COPY pyproject.toml ./ # buildkit
# 2026-07-19 17:19:14 31.92KB 复制新文件或目录到容器中
COPY scripts/ ./scripts/ # buildkit
# 2026-07-19 17:19:14 186.83KB 复制新文件或目录到容器中
COPY deeptutor_cli/ ./deeptutor_cli/ # buildkit
# 2026-07-19 17:19:14 5.32MB 复制新文件或目录到容器中
COPY deeptutor/ ./deeptutor/ # buildkit
# 2026-07-19 17:19:14 745.93KB 复制新文件或目录到容器中
COPY /app/web/public/ ./web/public/ # buildkit
# 2026-07-19 17:19:14 10.64MB 复制新文件或目录到容器中
COPY /app/web/.next/static/ ./web/.next/static/ # buildkit
# 2026-07-19 17:19:14 64.59MB 复制新文件或目录到容器中
COPY /app/web/.next/standalone/ ./web/ # buildkit
# 2026-07-19 17:19:04 71.91KB 复制新文件或目录到容器中
COPY /usr/local/bin /usr/local/bin # buildkit
# 2026-07-19 17:19:04 631.41MB 复制新文件或目录到容器中
COPY /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages # buildkit
# 2026-07-19 17:17:12 236.94KB 执行命令并创建新的镜像层
RUN /bin/sh -c ln -sf /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && ln -sf /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx && node --version && npm --version # buildkit
# 2026-07-19 17:17:12 11.94MB 复制新文件或目录到容器中
COPY /usr/local/lib/node_modules /usr/local/lib/node_modules # buildkit
# 2026-07-19 17:17:11 124.84MB 复制新文件或目录到容器中
COPY /usr/local/bin/node /usr/local/bin/node # buildkit
# 2026-07-19 17:17:11 266.26MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && apt-get install -y --no-install-recommends curl ca-certificates bash supervisor libgl1 libglib2.0-0 libsm6 libxext6 libxrender1 && rm -rf /var/lib/apt/lists/* # buildkit
# 2026-07-19 17:16:38 0.00B 设置工作目录为/app
WORKDIR /app
# 2026-07-19 17:16:38 0.00B 设置环境变量 PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED PYTHONIOENCODING NODE_ENV DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PYTHONIOENCODING=utf-8 NODE_ENV=production DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES=1
# 2026-07-19 17:16:38 0.00B 添加元数据标签
LABEL maintainer=DeepTutor Team description=DeepTutor: AI-Powered Personalized Learning Assistant
# 2026-07-14 10:10:44 0.00B 设置默认要执行的命令
CMD ["python3"]
# 2026-07-14 10:10:44 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-07-14 10:10:44 42.29MB 执行命令并创建新的镜像层
RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends dpkg-dev 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"; 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 install --disable-pip-version-check --no-cache-dir --no-compile 'setuptools==79.0.1' 'wheel==0.46.3' ; pip3 --version # buildkit
# 2026-07-14 10:03:18 0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625
# 2026-07-14 10:03:18 0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.11.15
# 2026-07-14 10:03:18 0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D
# 2026-07-14 10:03:18 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-07-14 10:03:18 0.00B 设置环境变量 LANG
ENV LANG=C.UTF-8
# 2026-07-14 10:03:18 0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 2026-07-13 08:00:00 78.62MB
# debian.sh --arch 'amd64' out/ 'trixie' '@1783900800'
镜像信息
{
"Id": "sha256:d3b4ad6c26670cb7019678b7c55080e4f484ce349585957bab95a91f2fa9ee32",
"RepoTags": [
"ghcr.io/hkuds/deeptutor:1.5.2",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.5.2"
],
"RepoDigests": [
"ghcr.io/hkuds/deeptutor@sha256:4e0dbc2c0d15fe50eaf2a9d7dac48c3f5b1c3b19ac5a8d69c8edd48609b627de",
"swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor@sha256:f4278beb3055fab32196d59919c7dfa164db6261c0a0711b3cca4b22835d77d7"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2026-07-19T09:19:17.341663205Z",
"Container": "",
"ContainerConfig": null,
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3782/tcp": {},
"8001/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=C.UTF-8",
"GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D",
"PYTHON_VERSION=3.11.15",
"PYTHON_SHA256=272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625",
"PYTHONDONTWRITEBYTECODE=1",
"PYTHONUNBUFFERED=1",
"PYTHONIOENCODING=utf-8",
"NODE_ENV=production",
"DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES=1"
],
"Cmd": null,
"Healthcheck": {
"Test": [
"CMD-SHELL",
"python /app/healthcheck.py"
],
"Interval": 30000000000,
"Timeout": 10000000000,
"StartPeriod": 60000000000,
"Retries": 3
},
"Image": "",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": [
"/app/entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"description": "DeepTutor: AI-Powered Personalized Learning Assistant",
"maintainer": "DeepTutor Team",
"org.opencontainers.image.created": "2026-07-19T09:16:31.996Z",
"org.opencontainers.image.description": "DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.",
"org.opencontainers.image.licenses": "Apache-2.0",
"org.opencontainers.image.revision": "b728354863540466f5410bec3530eb55a9fe0edc",
"org.opencontainers.image.source": "https://github.com/HKUDS/DeepTutor",
"org.opencontainers.image.title": "DeepTutor",
"org.opencontainers.image.url": "https://github.com/HKUDS/DeepTutor",
"org.opencontainers.image.version": "1.5.2"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 1266668430,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/b32d24565dead1f9ee02963ae7a6b737352555ab25ce32118f522928fa43f00b/diff:/var/lib/docker/overlay2/5fc581bdb063b52bff17e43fffedb93a08eb0483e970a614a139c12e7bd0e29f/diff:/var/lib/docker/overlay2/0d689bbd73e0658e189f6b50e9bdb0db50a087962568e6b9d98bcc8890027478/diff:/var/lib/docker/overlay2/7dce99aec7254cef4b94701a9bbb3c97792999c1531625468c83205e16b021ad/diff:/var/lib/docker/overlay2/a53ce3e2a1b866fb039a070092e8a40acc4236d10d7b08b78cd48a379cf36396/diff:/var/lib/docker/overlay2/c31a2b2f5ef80cbac24e605b8a418b5fbcaac156d08fe9fa29f3f621d6e1935b/diff:/var/lib/docker/overlay2/5d2c1f85b21776a9fd85d521822fe162e84b411f0670076481608334701e70b7/diff:/var/lib/docker/overlay2/eba26cea292c5d3ccf9caa01f1f83b21671fc44400aada4ae7e6434224ecc91a/diff:/var/lib/docker/overlay2/6be62993e4c2b362966c0d092049ba77400c8faac309aea433e3c314d323f0ec/diff:/var/lib/docker/overlay2/db6575e3b5334d7ed4db5ea517d6f15bbdb8a3c95b6329f73afa3075771d7f4c/diff:/var/lib/docker/overlay2/4c06a9280e22ddc42213df7b49cd3f3bd640fa3e52bc11d29333b84f0866590d/diff:/var/lib/docker/overlay2/7489674913c57ee4d7c5ed6555b035daef2f115add4b67d49c283c7188c9c4bf/diff:/var/lib/docker/overlay2/db2480681179015b4199f939528426f9ecd6c9ea304c9c1ec0940c993a48cf77/diff:/var/lib/docker/overlay2/42dc2025304d2664a108c5542b0a70663e5246abb3253e13b1f1edc6b3cb0a92/diff:/var/lib/docker/overlay2/be6fcb81693351dd8470d0ecc5f866c527c2c3e422e9332e1679e6559471b312/diff:/var/lib/docker/overlay2/2210b0f93537298ebc3e4801dff1621cb71071dc0bc793867cdae58e5fa77303/diff:/var/lib/docker/overlay2/63b29a01b6bbe7277e8a42ca2cd3d4cc67ee198014239d5cfab5ef4ffd1b585f/diff:/var/lib/docker/overlay2/5fea48f6b465bd22efffbea7b2625cc8d125f546e292db691662116ff1fee174/diff:/var/lib/docker/overlay2/c7c29ec61176094d27d9f80cb09776223f219e3c8407f86c13d447710e9c65e8/diff:/var/lib/docker/overlay2/b3b84b8fd953b8acc0cfda90328004de3f1936fde339b4d7db34d88cd91f65a7/diff:/var/lib/docker/overlay2/6ca0edd1b1f3ad6b46f14c909e0f1d16e5529878e0df268139aee564d8df260b/diff:/var/lib/docker/overlay2/74fdee5ba25188674c3d749add5b7e90de8fb5d0021851d9c6746bea53669cf8/diff:/var/lib/docker/overlay2/87a5d801356abab82eeca7bf1d97d2d72ec6316b3e863c54638e3662f7805e6a/diff:/var/lib/docker/overlay2/a028dcab038a90562cbf1828d96f4f4baf3ae6b9fe71a59648f7377c24227bc5/diff:/var/lib/docker/overlay2/ccca82a19e64c47aa358f5b6de7c641e1569eb232ce3ea9966b5fa700ae4fdfb/diff:/var/lib/docker/overlay2/5bc9d7c1ccd0c7d424dbc7007b1c3a33896b06ca433604b6c2f0cf44a5b4fc3a/diff:/var/lib/docker/overlay2/252e4356db3eb8636a7c881a10652182beaba9bd4298fd6cda774792c85cfb95/diff:/var/lib/docker/overlay2/b3ddeb753c2a9466ce9e8b8a24721da8cf55f9623ce2b4c8a73fb5b26e0a536d/diff:/var/lib/docker/overlay2/6950543f63dccce630fc17c06aa62018e5a84fdee384968a1c87d2dc9431a80c/diff:/var/lib/docker/overlay2/6c7b3df8a004536929c728ec93981a0f660820adf370e3c1c62e83a9aa955b34/diff:/var/lib/docker/overlay2/d4a03869327e766ec225f580788492938049f3f6d45cef025a605beb91846033/diff:/var/lib/docker/overlay2/845607d30e343e732c93371b85b9cde81a5d3ba260bd065b9b1ea3dde3afcfec/diff:/var/lib/docker/overlay2/f24ade665d94e6f8ff29f06c32243f0eb4e1ac8da4feddb1b4ad6020791e6a90/diff",
"MergedDir": "/var/lib/docker/overlay2/2d29e3410c3d94f95cb36b7884b7ce34db3ed9dc99e498017cadaf5c4a09a616/merged",
"UpperDir": "/var/lib/docker/overlay2/2d29e3410c3d94f95cb36b7884b7ce34db3ed9dc99e498017cadaf5c4a09a616/diff",
"WorkDir": "/var/lib/docker/overlay2/2d29e3410c3d94f95cb36b7884b7ce34db3ed9dc99e498017cadaf5c4a09a616/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f2ec4de84f559f5c7be4233b589cdbdbb5507807e05621b77320edd55a1f2a0f",
"sha256:1d1e59fb358647027ab521a60f44f87f158376fd9477b6542ef8e88992301dd1",
"sha256:99ab40bce873c6bc2ef49d1441dcbd1752681c34a02f4655fb3f68f8f2b34523",
"sha256:fc95983f78e7d6f0a6a727cef3214722721b65d6d2710fc433fc381cac671ec2",
"sha256:a18a1d80f5463afc1864cd1a1c70ec7698ef485b2f2b22621eab2e7c90798998",
"sha256:878371e35e9c2fee91a034d93acfabc143abe712ae6d17c27df4bf71b1bc9fc7",
"sha256:f88b6e85f589b9f061d173bfc7b6961ea5075fd203a3c6646353cb44c8b82585",
"sha256:a32d528b0a21b329e2f68f184377180f1a22647439e58adaeeb7178bd67c9723",
"sha256:c4fff10f33fb3bdecd803f61a7c1bfc1fe80ac7852543234cf661260f0b41e30",
"sha256:1091b3fe1e126330d97395123238870c57a4335979fb03cc3673a09684dc9ad3",
"sha256:e209a5bf4e5a0d0aea1410522c6af17ad54717aaf120825ea986a198907a9170",
"sha256:18570555a3bf5940d58aaf4cb24520bec822839a580cb90d30b19d81c2f7491b",
"sha256:360835adb6abd833bb4de45fbc3033756995d7eddf65a7de23ac506379adff54",
"sha256:1318e8976e48979e234ed8be70e0cf41a140924b1a56ee9c3c62d035d19ae974",
"sha256:be9e9f008286957258176a986b8ad85f2f9cb5637c3f3b1ca0c3007ef75358b2",
"sha256:85b191645da496b503aab8b535dfebd78551a91f1045ca2b7bd439c284bca484",
"sha256:f4fb0558eb835ffba524021e3b3ef3b5ebe6d8b3340e942292c434a8b6b527fe",
"sha256:5a5d4a1c616528f74a9a03a43decb990e24b5e13e56b758b9a036d667541a318",
"sha256:79ddfeba62da3d17a88af54bca802bc91a75390b597be237de02c9c9433732cf",
"sha256:1d30ed357bdb15fdad7307c82766e0724e2344ff36210ee29aece6c23463aa7d",
"sha256:286cb2be696d33783d445dd9a6a78a893ff363c547b6564f7c1250d8535a411c",
"sha256:92059e9bd8ddb471239fb020ba118cdb96d15a3a298a096173cd1d1b6a555e77",
"sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
"sha256:5ee785974f12c8afeabf35430896167fef210493e8a632a138c0a14448af740a",
"sha256:8b4af673ceea6244023c10da7d22cbe7c9766e24b0a4960bbf51c6876371f7a1",
"sha256:ddf1606b0e6f71611a8dc36027fd81a359f9bbd544e5cd55f814373ca9e22e2b",
"sha256:ddf1606b0e6f71611a8dc36027fd81a359f9bbd544e5cd55f814373ca9e22e2b",
"sha256:aaac43a62259bab2d2c74d9e43c6c79cb6bc7c4dd3783d0c97981fe3c107bf2a",
"sha256:4c29bc6bf97d6af814b22c36ecffd25705e56e411f06e26c28f43446b4d7407a",
"sha256:3a9c499d7b79ab52b171a92ee9afe4069883f3094d91efdfb1942713c827920f",
"sha256:e9523a46277de7ef6e8b9ca59a83bc87713e738cf56a2d5b7b4b0858b5aca9ef",
"sha256:90ae0da2499a53aca9bdc89de71fd3f8813891fade3f9b51cea3578e01bb531b",
"sha256:00fd1d367f19ed0575bdc56cd80e28642b3b13ed4f5b2eaaf393bf030c3db773",
"sha256:5263fa1a288b2f67b272af6cc331874bc4cbe86c3ab16b225a05b0c17c913ec7"
]
},
"Metadata": {
"LastTagTime": "2026-07-20T17:54:45.103560215+08:00"
}
}