Update Docker runtime to pull latest code on startup.

Install git in image and change start script to clone/pull target branch, reinstall dependencies, rebuild frontend, then launch backend and frontend services.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
renjue
2026-05-09 16:19:18 +08:00
parent 82581d2949
commit 7e3f4d792f
3 changed files with 34 additions and 17 deletions

View File

@@ -3,24 +3,11 @@ FROM node:20-bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3 python3-pip ca-certificates \
&& apt-get install -y --no-install-recommends python3 python3-pip ca-certificates git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Install backend dependencies.
COPY backend/requirements.txt /app/backend/requirements.txt
RUN python3 -m pip install --no-cache-dir -r /app/backend/requirements.txt
# Install frontend dependencies and build.
COPY frontend/package*.json /app/frontend/
WORKDIR /app/frontend
RUN npm install
COPY frontend /app/frontend
RUN npm run build
# Copy backend source and runtime launcher.
WORKDIR /app
COPY backend /app/backend
COPY docker/start.sh /app/docker/start.sh
RUN chmod +x /app/docker/start.sh

View File

@@ -58,7 +58,7 @@ npm run dev
## Docker 单容器运行
项目提供了单容器运行前后端的 `Dockerfile`,容器内会同时启动:
项目提供了单容器运行前后端的 `Dockerfile`,容器启动时会先从 Git 拉取最新代码,然后再启动:
- Flask 后端:`14620`
- 前端预览服务:`14621`
@@ -76,6 +76,14 @@ docker run --rm -it \
-p 14620:14620 \
-p 14621:14621 \
--env-file backend/.env \
-e GIT_REPO_URL=https://git.rc707blog.top/rose_cat707/media_crawler.git \
-e GIT_BRANCH=main \
media-crawler:latest
```
可选环境变量:
- `GIT_REPO_URL`:容器启动时拉取代码的仓库地址
- `GIT_BRANCH`:拉取分支(默认 `main`
- `WORKTREE_DIR`:容器内代码目录(默认 `/app/runtime`

View File

@@ -1,14 +1,36 @@
#!/usr/bin/env sh
set -eu
GIT_REPO_URL="${GIT_REPO_URL:-https://git.rc707blog.top/rose_cat707/media_crawler.git}"
GIT_BRANCH="${GIT_BRANCH:-main}"
WORKTREE_DIR="${WORKTREE_DIR:-/app/runtime}"
BACKEND_PORT="${FLASK_RUN_PORT:-14620}"
FRONTEND_PORT="${FRONTEND_PORT:-14621}"
cd /app/backend
echo "[start] syncing source from ${GIT_REPO_URL} (${GIT_BRANCH})"
if [ ! -d "${WORKTREE_DIR}/.git" ]; then
rm -rf "${WORKTREE_DIR}"
git clone --branch "${GIT_BRANCH}" --single-branch "${GIT_REPO_URL}" "${WORKTREE_DIR}"
else
git -C "${WORKTREE_DIR}" fetch origin "${GIT_BRANCH}"
git -C "${WORKTREE_DIR}" checkout "${GIT_BRANCH}"
git -C "${WORKTREE_DIR}" reset --hard "origin/${GIT_BRANCH}"
fi
echo "[start] installing backend dependencies"
python3 -m pip install --no-cache-dir -r "${WORKTREE_DIR}/backend/requirements.txt"
echo "[start] installing frontend dependencies and building"
cd "${WORKTREE_DIR}/frontend"
npm install
npm run build
echo "[start] launching backend:${BACKEND_PORT} and frontend:${FRONTEND_PORT}"
cd "${WORKTREE_DIR}/backend"
python3 app.py &
BACKEND_PID=$!
cd /app/frontend
cd "${WORKTREE_DIR}/frontend"
npm run preview -- --host 0.0.0.0 --port "${FRONTEND_PORT}" &
FRONTEND_PID=$!