fix: 用 entrypoint 脚本处理默认数据文件,解决 Docker 部署问题

问题:docker-compose 挂载单文件时,宿主机文件不存在会创建为目录,
Dockerfile 构建时也可能因残留目录导致 echo > file 失败。

方案:
- 新增 docker-entrypoint.sh:容器启动时检查并创建缺失的默认 JSON 文件,
  已有数据不覆盖
- Dockerfile 不再在构建时创建数据文件,改用 ENTRYPOINT 脚本
- docker-compose 默认不挂载单文件(避免目录/文件类型冲突),
  注释中说明如何手动启用持久化

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
易生
2026-03-25 09:31:38 +00:00
parent 080579aad9
commit 8cb972cfc8
4 changed files with 19 additions and 8 deletions

View File

@@ -11,6 +11,3 @@ node_modules
frontend/node_modules
frontend/dist
.claude
projects.json
xp_presets.json
config.json

View File

@@ -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"]

View File

@@ -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

10
docker-entrypoint.sh Executable file
View File

@@ -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 "$@"