From 8cb972cfc8f5b6d4f67399343483a057251946a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=93=E7=94=9F?= <42960628+tuxiangxianzhe@users.noreply.github.com> Date: Wed, 25 Mar 2026 09:31:38 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=94=A8=20entrypoint=20=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=A4=84=E7=90=86=E9=BB=98=E8=AE=A4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E8=A7=A3=E5=86=B3=20Docker=20?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:docker-compose 挂载单文件时,宿主机文件不存在会创建为目录, Dockerfile 构建时也可能因残留目录导致 echo > file 失败。 方案: - 新增 docker-entrypoint.sh:容器启动时检查并创建缺失的默认 JSON 文件, 已有数据不覆盖 - Dockerfile 不再在构建时创建数据文件,改用 ENTRYPOINT 脚本 - docker-compose 默认不挂载单文件(避免目录/文件类型冲突), 注释中说明如何手动启用持久化 Co-Authored-By: Claude Opus 4.6 (1M context) --- .dockerignore | 3 --- Dockerfile | 9 ++++----- docker-compose.yml | 5 +++++ docker-entrypoint.sh | 10 ++++++++++ 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100755 docker-entrypoint.sh diff --git a/.dockerignore b/.dockerignore index 04c5107..cac7549 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,6 +11,3 @@ node_modules frontend/node_modules frontend/dist .claude -projects.json -xp_presets.json -config.json diff --git a/Dockerfile b/Dockerfile index a912d7e..1577de5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,15 +40,14 @@ COPY . . # 复制前端构建产物 COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist -# 创建数据目录和默认数据文件(rm -rf 防止旧版挂载残留的同名目录) -RUN mkdir -p /app/output /app/styles /app/prompts \ - && rm -rf /app/projects.json /app/xp_presets.json \ - && echo '{"projects":{},"active_project":""}' > /app/projects.json \ - && echo '[]' > /app/xp_presets.json +# 启动入口脚本(负责创建缺失的默认数据文件,不覆盖已有数据) +COPY docker-entrypoint.sh /app/docker-entrypoint.sh +RUN chmod +x /app/docker-entrypoint.sh EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:7860/api/health')" || exit 1 +ENTRYPOINT ["/app/docker-entrypoint.sh"] CMD ["uvicorn", "api_server:app", "--host", "0.0.0.0", "--port", "7860"] diff --git a/docker-compose.yml b/docker-compose.yml index f459c6d..aa3348e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,11 @@ services: - ./styles:/app/styles - ./prompts:/app/prompts - ./vectorstore:/app/vectorstore + # 如需持久化配置(容器重建后保留),先手动创建文件再取消注释: + # touch config.json projects.json xp_presets.json + # - ./config.json:/app/config.json + # - ./projects.json:/app/projects.json + # - ./xp_presets.json:/app/xp_presets.json environment: - TZ=Asia/Shanghai restart: unless-stopped diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 0000000..ebf1594 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# 容器启动前确保运行时数据文件存在(不覆盖已有数据) + +[ -f /app/config.json ] || echo '{}' > /app/config.json +[ -f /app/projects.json ] || echo '{"projects":{},"active_project":""}' > /app/projects.json +[ -f /app/xp_presets.json ] || echo '[]' > /app/xp_presets.json + +mkdir -p /app/output /app/styles /app/prompts + +exec "$@"