logo
ghcr.io/hkuds/deeptutor:1.6.8
linux/amd64 ghcr.io

这是一个用于深度学习辅导的Docker镜像,提供相关的教学资源和工具,帮助用户学习深度学习相关知识和技能。

15
浏览次数
1.59GB
镜像大小
国内镜像
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8
源镜像
ghcr.io/hkuds/deeptutor:1.6.8
镜像ID
sha256:a63b48ecf4552989ac934aad1365e4bf8f8844aa3572f815fd3989d5adb5b31a
镜像 TAG
1.6.8
镜像大小
1.59GB
平台架构
linux/amd64
镜像源
ghcr.io
CMD
启动入口
/app/entrypoint.sh
工作目录
/app
OS/平台
linux/amd64
镜像创建
2026-09-14T06:59:52.038000728Z
同步时间
2026-09-17 13:12
浏览量
15 次
贡献者
🔌 开放端口 2
3782/tcp 8001/tcp
⚙️ 环境变量 12
KeyValue
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0
LANG=C.UTF-8 1
GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D 2
PYTHON_VERSION=3.11.16 3
PYTHON_SHA256=91bcdebfdde239a003ae93738a7fce0f9230fee5c4bc2b86f6e6e8c6f98aabe8 4
PYTHONDONTWRITEBYTECODE=1 5
PYTHONUNBUFFERED=1 6
PYTHONIOENCODING=utf-8 7
MALLOC_ARENA_MAX=2 8
MALLOC_TRIM_THRESHOLD_=131072 9
NODE_ENV=production 10
DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES=1 11
🏷️ 镜像标签 10
KeyValue
DeepTutor: AI-Powered Personalized Learning Assistant description
DeepTutor Team maintainer
2026-09-14T06:55:43.185Z org.opencontainers.image.created
DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/. org.opencontainers.image.description
Apache-2.0 org.opencontainers.image.licenses
a7c30a588f883ed7d92f806c4976c05b5b8fc2e1 org.opencontainers.image.revision
https://github.com/HKUDS/DeepTutor org.opencontainers.image.source
DeepTutor org.opencontainers.image.title
https://github.com/HKUDS/DeepTutor org.opencontainers.image.url
1.6.8 org.opencontainers.image.version
🛡️ 镜像安全扫描
debian 13.6 Trivy 2026-09-17 13:13 查看完整报告
162
低危 LOW
165
中危 MEDIUM
121
高危 HIGH
4
严重 CRITICAL
受影响目标 (3)
ghcr.io/hkuds/deeptutor:1.6.8 (debian 13.6) debian Node.js node-pkg Python python-pkg

Docker拉取命令

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8  ghcr.io/hkuds/deeptutor:1.6.8

Containerd拉取命令

ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8
ctr images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8  ghcr.io/hkuds/deeptutor:1.6.8

Shell快速替换命令

sed -i 's#ghcr.io/hkuds/deeptutor:1.6.8#swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8#' deployment.yaml

Ansible快速分发-Docker

#ansible k8s -m shell -a 'docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8 && docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8  ghcr.io/hkuds/deeptutor:1.6.8'

Ansible快速分发-Containerd

#ansible k8s -m shell -a 'ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8 && ctr images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8  ghcr.io/hkuds/deeptutor:1.6.8'

镜像构建历史


# 2026-09-14 14:59:52  0.00B 配置容器启动时运行的命令
ENTRYPOINT ["/app/entrypoint.sh"]
                        
# 2026-09-14 14:59:52  0.00B 指定检查容器健康状态的命令
HEALTHCHECK {Test:[CMD-SHELL python /app/healthcheck.py] Interval:30s Timeout:10s StartPeriod:1m0s StartInterval:0s Retries:3}
                        
# 2026-09-14 14:59:52  0.00B 声明容器运行时监听的端口
EXPOSE [3782/tcp 8001/tcp]
                        
# 2026-09-14 14:59:52  370.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}/health/ready", timeout=5).close()
EOF # buildkit
                        
# 2026-09-14 14:59:51  5.14KB 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/entrypoint.sh && chmod +x /app/entrypoint.sh # buildkit
                        
# 2026-09-14 14:59:51  5.14KB 执行命令并创建新的镜像层
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 \
    BACKEND_WORKERS \
    DEEPTUTOR_BACKEND_WORKERS \
    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

# Optional dependencies (#762). A container is disposable, so anything
# `docker exec … pip install`ed into a running one is gone at the next
# `compose down`. Declare them on the deployment instead and every container
# started from it has them:
#
#   environment:
#     DEEPTUTOR_EXTRAS: "math-animator,partners"
#     DEEPTUTOR_APT_PACKAGES: "ffmpeg"
#
# Both steps are idempotent — a warm container only pays a check — and neither
# is allowed to be fatal: a missing wheel leaves that one feature unavailable,
# exactly as it was before, rather than taking the whole deployment down.
# The pip cache lives on the data volume so a rebuild reuses the downloads it
# already paid for instead of fetching them again.
export PIP_CACHE_DIR="${PIP_CACHE_DIR:-/app/data/.cache/pip}"
mkdir -p "$PIP_CACHE_DIR" 2>/dev/null || true

if [ -n "${DEEPTUTOR_APT_PACKAGES:-}" ]; then
    echo "🔧 Ensuring system packages: ${DEEPTUTOR_APT_PACKAGES}"
    apt_missing=""
    for pkg in $(echo "${DEEPTUTOR_APT_PACKAGES}" | tr ',' ' '); do
        dpkg -s "$pkg" >/dev/null 2>&1 || apt_missing="$apt_missing $pkg"
    done
    if [ -z "$apt_missing" ]; then
        echo "   ✅ System packages already present"
    elif ! (apt-get update -qq && apt-get install -y --no-install-recommends $apt_missing); then
        echo "   ⚠️ apt-get failed; these packages stay unavailable:$apt_missing"
    fi
fi

if [ -n "${DEEPTUTOR_EXTRAS:-}" ]; then
    echo "🔧 Ensuring Python extras: ${DEEPTUTOR_EXTRAS}"
    python /app/scripts/install_extras.py "${DEEPTUTOR_EXTRAS}" || true
    chown -R deeptutor:deeptutor "$PIP_CACHE_DIR" 2>/dev/null || true
fi

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-09-14 14:59:51  278.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/start-frontend.sh && chmod +x /app/start-frontend.sh # buildkit
                        
# 2026-09-14 14:59:51  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-09-14 14:59:51  1.69KB 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /app/start-backend.sh && chmod +x /app/start-backend.sh # buildkit
                        
# 2026-09-14 14:59:51  1.69KB 执行命令并创建新的镜像层
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}
BACKEND_WORKERS=${BACKEND_WORKERS:-1}

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.
#
# --timeout-keep-alive: the frontend proxy (web/proxy.ts) forwards over Node's
# http.globalAgent, which reaps idle sockets on a 5s timer — identical to
# uvicorn's default, so both ends raced to close the same socket and the loser's
# request died with ECONNRESET (a 500 in the UI). Stay well above the proxy's
# reaper so the client is the only side retiring idle connections.
WS_MAX_SIZE=$(python -c "from deeptutor.services.config import get_ws_max_size; print(get_ws_max_size())" 2>/dev/null || echo 16777216)
KEEP_ALIVE=$(python -c "from deeptutor.services.config import HTTP_KEEP_ALIVE_TIMEOUT; print(HTTP_KEEP_ALIVE_TIMEOUT)" 2>/dev/null || echo 300)
exec python -m uvicorn deeptutor.api.main:app --host ${BACKEND_HOST} --port ${BACKEND_PORT} --workers ${BACKEND_WORKERS} --no-access-log --no-proxy-headers --ws-max-size ${WS_MAX_SIZE} --timeout-keep-alive ${KEEP_ALIVE}
EOF # buildkit
                        
# 2026-09-14 14:59:51  548.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /etc/supervisor/conf.d/programs.conf # buildkit
                        
# 2026-09-14 14:59:51  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-09-14 14:59:51  150.00B 执行命令并创建新的镜像层
RUN /bin/sh -c sed -i 's/\r$//' /etc/supervisor/supervisord.conf # buildkit
                        
# 2026-09-14 14:59:51  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-09-14 14:59:51  0.00B 执行命令并创建新的镜像层
RUN /bin/sh -c mkdir -p /etc/supervisor/conf.d # buildkit
                        
# 2026-09-14 14:59:51  30.79MB 执行命令并创建新的镜像层
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-09-14 14:59:49  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_exec     data/user/logs     data/knowledge_bases # buildkit
                        
# 2026-09-14 14:59:49  1.02KB 复制新文件或目录到容器中
COPY requirements.txt ./ # buildkit
                        
# 2026-09-14 14:59:49  8.05KB 复制新文件或目录到容器中
COPY requirements/ ./requirements/ # buildkit
                        
# 2026-09-14 14:59:49  19.23KB 复制新文件或目录到容器中
COPY pyproject.toml ./ # buildkit
                        
# 2026-09-14 14:59:49  78.12KB 复制新文件或目录到容器中
COPY scripts/ ./scripts/ # buildkit
                        
# 2026-09-14 14:59:49  216.75KB 复制新文件或目录到容器中
COPY deeptutor_cli/ ./deeptutor_cli/ # buildkit
                        
# 2026-09-14 14:59:49  9.84MB 复制新文件或目录到容器中
COPY deeptutor/ ./deeptutor/ # buildkit
                        
# 2026-09-14 14:59:47  2.44MB 复制新文件或目录到容器中
COPY /app/web/public/ ./web/public/ # buildkit
                        
# 2026-09-14 14:59:47  14.11MB 复制新文件或目录到容器中
COPY /app/web/.next/static/ ./web/.next/static/ # buildkit
                        
# 2026-09-14 14:59:47  77.34MB 复制新文件或目录到容器中
COPY /app/web/.next/standalone/ ./web/ # buildkit
                        
# 2026-09-14 14:59:10  79.88KB 复制新文件或目录到容器中
COPY /usr/local/bin /usr/local/bin # buildkit
                        
# 2026-09-14 14:59:09  824.16MB 复制新文件或目录到容器中
COPY /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages # buildkit
                        
# 2026-09-14 14:56:49  236.95KB 执行命令并创建新的镜像层
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-09-14 14:56:48  11.94MB 复制新文件或目录到容器中
COPY /usr/local/lib/node_modules /usr/local/lib/node_modules # buildkit
                        
# 2026-09-14 14:56:47  124.84MB 复制新文件或目录到容器中
COPY /usr/local/bin/node /usr/local/bin/node # buildkit
                        
# 2026-09-14 14:56:46  361.90MB 执行命令并创建新的镜像层
RUN /bin/sh -c apt-get update && apt-get install -y --no-install-recommends     curl     ca-certificates     bash     git     supervisor     libgl1     libglib2.0-0     libsm6     libxext6     libxrender1     && rm -rf /var/lib/apt/lists/* # buildkit
                        
# 2026-09-14 14:55:55  0.00B 设置工作目录为/app
WORKDIR /app
                        
# 2026-09-14 14:55:55  0.00B 设置环境变量 PYTHONDONTWRITEBYTECODE PYTHONUNBUFFERED PYTHONIOENCODING MALLOC_ARENA_MAX MALLOC_TRIM_THRESHOLD_ NODE_ENV DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PYTHONIOENCODING=utf-8 MALLOC_ARENA_MAX=2 MALLOC_TRIM_THRESHOLD_=131072 NODE_ENV=production DEEPTUTOR_IGNORE_PROCESS_ENV_OVERRIDES=1
                        
# 2026-09-14 14:55:55  0.00B 添加元数据标签
LABEL maintainer=DeepTutor Team description=DeepTutor: AI-Powered Personalized Learning Assistant
                        
# 2026-09-01 08:14:30  0.00B 设置默认要执行的命令
CMD ["python3"]
                        
# 2026-09-01 08:14:30  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-09-01 08:14:30  42.43MB 执行命令并创建新的镜像层
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"; 	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-09-01 08:07:16  0.00B 设置环境变量 PYTHON_SHA256
ENV PYTHON_SHA256=91bcdebfdde239a003ae93738a7fce0f9230fee5c4bc2b86f6e6e8c6f98aabe8
                        
# 2026-09-01 08:07:16  0.00B 设置环境变量 PYTHON_VERSION
ENV PYTHON_VERSION=3.11.16
                        
# 2026-09-01 08:07:16  0.00B 设置环境变量 GPG_KEY
ENV GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D
                        
# 2026-09-01 08:07:16  11.97MB 执行命令并创建新的镜像层
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-09-01 08:07:16  0.00B 设置环境变量 LANG
ENV LANG=C.UTF-8
                        
# 2026-09-01 08:07:16  0.00B 设置环境变量 PATH
ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
                        
# 2026-08-24 08:00:00  78.64MB 
# debian.sh --arch 'amd64' out/ 'trixie' '@1787529600'
                        
                    

镜像信息

{
    "Id": "sha256:a63b48ecf4552989ac934aad1365e4bf8f8844aa3572f815fd3989d5adb5b31a",
    "RepoTags": [
        "ghcr.io/hkuds/deeptutor:1.6.8",
        "swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor:1.6.8"
    ],
    "RepoDigests": [
        "ghcr.io/hkuds/deeptutor@sha256:1fe16f48e090da11c1c16e3e9c4b08b12801fa9f153249d36dc9d50ee60d0ede",
        "swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/hkuds/deeptutor@sha256:53abc9df9a28e9b9af7836dcd498df9fbbec4c2e2136f18cd32055369dfa0195"
    ],
    "Parent": "",
    "Comment": "buildkit.dockerfile.v0",
    "Created": "2026-09-14T06:59:52.038000728Z",
    "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.16",
            "PYTHON_SHA256=91bcdebfdde239a003ae93738a7fce0f9230fee5c4bc2b86f6e6e8c6f98aabe8",
            "PYTHONDONTWRITEBYTECODE=1",
            "PYTHONUNBUFFERED=1",
            "PYTHONIOENCODING=utf-8",
            "MALLOC_ARENA_MAX=2",
            "MALLOC_TRIM_THRESHOLD_=131072",
            "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-09-14T06:55:43.185Z",
            "org.opencontainers.image.description": "DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.",
            "org.opencontainers.image.licenses": "Apache-2.0",
            "org.opencontainers.image.revision": "a7c30a588f883ed7d92f806c4976c05b5b8fc2e1",
            "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.6.8"
        }
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 1591044889,
    "GraphDriver": {
        "Data": {
            "LowerDir": "/var/lib/docker/overlay2/b77edf3ad46c6cfa04a9e7ad44b01a9df935e10f7d3eca7e6376675e8fd725ef/diff:/var/lib/docker/overlay2/375044997f12104486d2a520660f2e0253ec7aaa5398e7b56c4548d94cbeadac/diff:/var/lib/docker/overlay2/68fcb4f9dd6b48a17f3f71d197691e801c2f000472615e063c5c8877f2f331d1/diff:/var/lib/docker/overlay2/5841f1835ccf895dcfa2f3c3d67fc0d25a584cd6ac0567ae24cfc380d8909521/diff:/var/lib/docker/overlay2/8b7144017c721cdf22c7f7644dc67cabcf3707b8c8da268dbf02f9d792c41512/diff:/var/lib/docker/overlay2/40a4d736d45e58cb31733a002ca925e21b94cb568b1409fcdf201cd69c95102e/diff:/var/lib/docker/overlay2/2c04573ed1698ebc3b8c0a08f207414bbf7217ba82cc6d1b49599237d8b54512/diff:/var/lib/docker/overlay2/8cd8037046e13c9aa910d6afe9d9513b5bac9b3e4b894dd9034ee2984d4cd72a/diff:/var/lib/docker/overlay2/d0cf056ebc015d181e1ee27b2e197219c7b44ab1d9c4074b94610c824c6864b8/diff:/var/lib/docker/overlay2/b4420af3c4b68af91dffabf638c61e6348f258e8e5291a3271907c9c8772a971/diff:/var/lib/docker/overlay2/88c91e9cb2888345259cc8560b7202054eb8b9eb43cff293359956711d4f5cb6/diff:/var/lib/docker/overlay2/d0527000954415ce2d2243ca1b1c8eedd29c9e69e59880fbd5eeb7c5c26afb07/diff:/var/lib/docker/overlay2/7a5c3a5a7e13973446456a70bc94d30e8d139e304a76eaed501d7f8515d5add3/diff:/var/lib/docker/overlay2/23a203e78cb772f0f9dc31cc6288699b22accf80a48f95d5d45eabcad93da9c9/diff:/var/lib/docker/overlay2/76172c49cbee230e236258fcd7ea052e734beb2ece0a2a417c2b9e28321e00e6/diff:/var/lib/docker/overlay2/5583e0021487a551b4b3e7cb1db876160c614ccd8fdc0f7a65a8925dd9653e55/diff:/var/lib/docker/overlay2/0fedb311a696d2586fb9d6680068e21b596d229a919bc6345fb4102b06f89f70/diff:/var/lib/docker/overlay2/d90572a9435cd392216f52711140cf52f6f94d26b73688a34069ea0ef9ed1593/diff:/var/lib/docker/overlay2/3fc199413afcd485c04e28ddafeee0eee0904e80630a122e8d8735bcf12a657e/diff:/var/lib/docker/overlay2/92696606b7af8b91280d2573a1ed6f45a3dc4eb48d48735ac1c750eab2150953/diff:/var/lib/docker/overlay2/f418714688b90e3c5a7c0a73dce8d7056129350a64631e2a95088036e15aa816/diff:/var/lib/docker/overlay2/9c50ee6434ffd0b280bf271fc3c3fbeef2ce53cfbd17ebb0b5ca90a2a849cc5c/diff:/var/lib/docker/overlay2/f1f06daaca9c2fec3b63b4d15aa231214a3e885950cb346004076b82fa9ce0b3/diff:/var/lib/docker/overlay2/25cf66a567259532ff2b0b089e01c98b1b6d63077df1dfa30024ca06b252f35e/diff:/var/lib/docker/overlay2/4802f18eb2e0bc70545411b3870c897db02f41df2a7f2af40c92b2a8d6f964eb/diff:/var/lib/docker/overlay2/1c606bb3002bad8a74aba0edb030e7b81a081d65d5ac73a4f4fd615f593d8f2c/diff:/var/lib/docker/overlay2/1840ad687d7fcd4e7b512f0887238bf87ac37609db441de8b63cdd8e3ef395e5/diff:/var/lib/docker/overlay2/50062862dfd4a3c9c89baad6289496ae32766ba49c48084ba6564210e23f4bfd/diff:/var/lib/docker/overlay2/501ebb8dc708dc5c991228946a45e1c7162bd6ddc6abe7450345ea85d13fe68f/diff:/var/lib/docker/overlay2/e90e01e8578183ce7b9dfc84bd34087a3a25e43c1aa889bd8dedde27554ca32a/diff:/var/lib/docker/overlay2/dc49d56b6b0ff2f71d74afacc85b15bfe64872e34babccfb828294048868b02e/diff:/var/lib/docker/overlay2/65a1750e0a4412d198500480bb4700098550a1cea1e23b439b72d9b8fca719c5/diff:/var/lib/docker/overlay2/c2a696dacdcd5b8480d9f883645aef5d7f18bb808ab62a8bfbe4920c17c72905/diff",
            "MergedDir": "/var/lib/docker/overlay2/8ea38699df1e851ab37490f715e7462f22bcf5b516e6325f856425fc4fe892b9/merged",
            "UpperDir": "/var/lib/docker/overlay2/8ea38699df1e851ab37490f715e7462f22bcf5b516e6325f856425fc4fe892b9/diff",
            "WorkDir": "/var/lib/docker/overlay2/8ea38699df1e851ab37490f715e7462f22bcf5b516e6325f856425fc4fe892b9/work"
        },
        "Name": "overlay2"
    },
    "RootFS": {
        "Type": "layers",
        "Layers": [
            "sha256:411a86676185cb54d695a805b238194a64e9b77e0c723f3802fbb87d333ea0b3",
            "sha256:4d43b7f98e4c38fd2d37f37f1bf9965d2c4018b01453d3b29d924653c3275f4b",
            "sha256:7895f75e926a456464bbd0f1285738ba25e7d70aad4aa94c32c1d274b3b9e85e",
            "sha256:164ea7718b2462d163b7bd95ece7ebd8b669f0cdb1b094b66009aecec2f1195b",
            "sha256:d9296747da7c92d4d1ae35142ebba3c5a412a8d629b9d3783aa7478899781aba",
            "sha256:6b53732992f8e839755000d3062646fe1c6b71a459852365af1233d3932ff339",
            "sha256:22198154db20ddc335d2b0cdb2167bc2b393ff2d42b8b7cb0449030f30770518",
            "sha256:558ff1e8dc5d07d858cd5a8b3f144146c47ddf7177d304ed5228611b2a40be44",
            "sha256:4320c3302b168403b4487ab1fea4efc12dbe82795f587fe9a665a3826bf27966",
            "sha256:2fb676040902b851a9502c43e5b083f39ef1eb4779f66ccd7369d259046a3295",
            "sha256:d4f77b5818e18712f3f52aadbf152b00b1b7f35c2b4be580f4547d3489026af1",
            "sha256:b86c54ef5446c6a5aff7beaa73c385b5f1781942d232d4b551aa176fe5e30548",
            "sha256:6255f62a46ab504ac36d1cae831a065ad76cecad5347dc5050c1333735da5693",
            "sha256:7eadcfb5600961dd85281fb6d346a84f72f18b27085c9d5f03d502bd72648f67",
            "sha256:43e9ca9190970877332e054105e67acc29f8db47788f3c4ad7981a0458c6ab63",
            "sha256:f5ff849af3ba0251298d77b83e01f8c6915345a505af41aa35737f2605bdc80d",
            "sha256:546cee0a2b351f64ec67b0d42b82148f7bd39cb558fb682979ac3756fee93d0d",
            "sha256:cf9c29dd212227b207c8cea8dfbdc3e3fa004701b8d0ada39cf3ec5c1492beb6",
            "sha256:33ba4c9c30c45602a6060a8163b2464df0cdce4097e0f3175af11572e580335d",
            "sha256:3e879f92b0d4009f141e3ee398a71cb8ecf05e723a4c4d59215f7c36fe2fc15f",
            "sha256:0d434b5cb0bdbb256d264dea0a06a3d1f648109a84439eeaed4456c0a1467a56",
            "sha256:c067140ab9febabb53f6465d130e99212f69607c7d3b2a52ca0a83d33958eaf1",
            "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
            "sha256:a75082ba2c40624a8ba91757da98a524398814f54258c83670831ef6bc13b6d0",
            "sha256:a25ff920cd84323e8a741fdb4aa8a07e8f6b0fbc4befa899d07cf6279b4a82a3",
            "sha256:4e50b6e586aac76f9160c3a310241a6c4156945229fbce59a581aa5559802cd9",
            "sha256:4e50b6e586aac76f9160c3a310241a6c4156945229fbce59a581aa5559802cd9",
            "sha256:21774f62f2807b8372892057cd2b3dcba79a5912f7a6830808695868843333d7",
            "sha256:2dcb5a324e0170e0972aa70b6309c3875be0dea7571f8c627e8923b96fd42d75",
            "sha256:777c38d5d3b19924392148a2401b90ae26de374771297d07fb996974451953e6",
            "sha256:de8c3cf078376e161d4a5afcccc6868be85d8bd720e06f0315f4d4cf5548c196",
            "sha256:11b875922c59038c1b0291e8e1c29fd2ab0dc95990cd2cbe772a41c50f335596",
            "sha256:b1fc8b8e56ef65fe0112acf0abfe72b03120bc22c77a47de5169603116c90187",
            "sha256:0c2abdb94fc4ae14f8d6fdaf2104e664ba7fcda5d1fd4af85a5ad57bcc59eb17"
        ]
    },
    "Metadata": {
        "LastTagTime": "2026-09-17T13:11:59.582124421+08:00"
    }
}

更多版本

ghcr.io/hkuds/deeptutor:1.0.3

linux/amd64 ghcr.io1.10GB2026-04-14 11:01
321

ghcr.io/hkuds/deeptutor:1.1.2

linux/amd64 ghcr.io1.08GB2026-04-20 10:56
341

ghcr.io/hkuds/deeptutor:1.3.10

linux/amd64 ghcr.io1.11GB2026-05-22 18:03
234

ghcr.io/hkuds/deeptutor:1.5.2

linux/amd64 ghcr.io1.27GB2026-07-20 17:55
139

ghcr.io/hkuds/deeptutor:1.5.5

linux/amd64 ghcr.io1.27GB2026-07-27 11:25
129

ghcr.io/hkuds/deeptutor:1.5.6

linux/amd64 ghcr.io1.27GB2026-07-29 09:00
120

ghcr.io/hkuds/deeptutor:1.6.1

linux/amd64 ghcr.io1.57GB2026-08-30 18:57
77

ghcr.io/hkuds/deeptutor:1.6.8

linux/amd64 ghcr.io1.59GB2026-09-17 13:12
14

ghcr.io/hkuds/deeptutor:latest

linux/amd64 ghcr.io10.10GB2026-01-09 00:57
1016
检测到您正在使用广告拦截插件,本站为公益站点,依赖广告维持运转 🙏 查看如何关闭 ×