From be6a490a197d1f18e97ca52ceee9322892dc2341 Mon Sep 17 00:00:00 2001 From: engigu Date: Thu, 12 Feb 2026 12:10:44 +0800 Subject: [PATCH] feat: add mise base --- Makefile | 15 ++-- ...ompose.ghcr.yml => docker-compose.ghcr.yml | 0 .../docker-compose.yml => docker-compose.yml | 4 +- docker/Dockerfile | 3 +- docker/Dockerfile.alpine.base | 31 +++++---- docker/Dockerfile.base | 21 ++++-- docker/Dockerfile.debian13.base | 21 ++++-- docker/docker-entrypoint.sh | 69 ++++++------------- 8 files changed, 87 insertions(+), 77 deletions(-) rename docker/docker-compose.ghcr.yml => docker-compose.ghcr.yml (100%) rename docker/docker-compose.yml => docker-compose.yml (90%) diff --git a/Makefile b/Makefile index f871509..a4e87e0 100644 --- a/Makefile +++ b/Makefile @@ -97,19 +97,25 @@ deps: # Docker build docker-build: - docker build -t $(BINARY) -f docker/Dockerfile . + docker build -t baihu:dev -f docker/Dockerfile . # Docker run docker-run: - docker run -p 8052:8052 $(BINARY) + docker run -p 8052:8052 baihu:dev # Docker compose up docker-up: - docker-compose -f docker/docker-compose.yml up -d + docker-compose up -d # Docker compose down docker-down: - docker-compose -f docker/docker-compose.yml down + docker-compose down + +# Build and run in development mode (foreground with logs) +docker-dev: + docker-compose down + docker-compose build + docker-compose up # Help help: @@ -124,4 +130,5 @@ help: @echo " docker-run - Run Docker container" @echo " docker-up - Start Docker Compose stack" @echo " docker-down - Stop Docker Compose stack" + @echo " docker-dev - Build and run Docker Compose in foreground" @echo " help - Show this help message" \ No newline at end of file diff --git a/docker/docker-compose.ghcr.yml b/docker-compose.ghcr.yml similarity index 100% rename from docker/docker-compose.ghcr.yml rename to docker-compose.ghcr.yml diff --git a/docker/docker-compose.yml b/docker-compose.yml similarity index 90% rename from docker/docker-compose.yml rename to docker-compose.yml index f465f27..2bc6754 100644 --- a/docker/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,8 @@ services: baihu: - build: . + build: + context: . + dockerfile: docker/Dockerfile ports: - "8052:8052" volumes: diff --git a/docker/Dockerfile b/docker/Dockerfile index c423cb6..b676e71 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -115,8 +115,7 @@ FROM ghcr.io/engigu/baihu:${BASE_TAG} ENV TZ=Asia/Shanghai ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 -ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" -ENV NODE_PATH="/app/envs/node/lib/node_modules" +ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH" # # 安装必要系统工具 + Node + Python # RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ diff --git a/docker/Dockerfile.alpine.base b/docker/Dockerfile.alpine.base index 7fb9a8c..8f1e74a 100644 --- a/docker/Dockerfile.alpine.base +++ b/docker/Dockerfile.alpine.base @@ -1,24 +1,25 @@ FROM alpine:3.19 ENV TZ=Asia/Shanghai -ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" -ENV NODE_PATH="/app/envs/node/lib/node_modules" +ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH" -# 安装必要系统工具 + Node + Python +# 安装必要系统工具 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \ && apk add --no-cache \ - tzdata \ - git \ - gcc \ - musl-dev \ - curl \ - wget \ - vim \ - nodejs \ - npm \ - python3 \ - py3-pip \ - htop \ + tzdata git bash curl wget vim htop ca-certificates rsync \ + # Python build dependencies + build-base libffi-dev openssl-dev bzip2-dev zlib-dev readline-dev sqlite-dev ncurses-dev xz-dev \ && cp /usr/share/zoneinfo/${TZ} /etc/localtime \ && echo "${TZ}" > /etc/timezone \ && rm -rf /var/cache/apk/* + +# 安装 mise +RUN curl https://mise.run | MISE_INSTALL_PATH=/usr/local/bin/mise sh + +# 使用 mise 安装最新版本的 Node.js 和 Python +# 暂时安装到 /opt/mise-base,启动时会复制到 /app/envs/mise +ENV MISE_DATA_DIR=/opt/mise-base +ENV MISE_CONFIG_DIR=/opt/mise-base +ENV MISE_HTTP_TIMEOUT=300 +RUN (mise use -g node@latest python@latest || mise use -g node@latest python@latest || mise use -g node@latest python@latest) \ + && mise prune -- -f diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 1d7ffd6..cbf2870 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -1,15 +1,28 @@ FROM debian:bookworm-slim ENV TZ=Asia/Shanghai -ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" -ENV NODE_PATH="/app/envs/node/lib/node_modules" +ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH" -# 安装必要系统工具 + Node + Python +# 安装必要系统工具 RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ && echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && apt-get update \ && apt-get install -y --no-install-recommends \ - tzdata git gcc curl wget vim nodejs htop npm python3 python3-venv python3-pip \ + tzdata git gcc curl wget vim htop ca-certificates rsync \ + build-essential libssl-dev zlib1g-dev libbz2-dev \ + libreadline-dev libsqlite3-dev libncursesw5-dev \ + xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \ && rm -rf /var/lib/apt/lists/* + +# 安装 mise +RUN curl https://mise.run | MISE_INSTALL_PATH=/usr/local/bin/mise sh + +# 使用 mise 安装最新版本的 Node.js 和 Python +# 暂时安装到 /opt/mise-base,启动时会复制到 /app/envs/mise +ENV MISE_DATA_DIR=/opt/mise-base +ENV MISE_CONFIG_DIR=/opt/mise-base +ENV MISE_HTTP_TIMEOUT=300 +RUN (mise use -g node@latest python@latest || mise use -g node@latest python@latest || mise use -g node@latest python@latest) \ + && mise prune -- -f diff --git a/docker/Dockerfile.debian13.base b/docker/Dockerfile.debian13.base index d37c4a1..c7611e1 100644 --- a/docker/Dockerfile.debian13.base +++ b/docker/Dockerfile.debian13.base @@ -1,15 +1,28 @@ FROM debian:trixie-slim ENV TZ=Asia/Shanghai -ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" -ENV NODE_PATH="/app/envs/node/lib/node_modules" +ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH" -# 安装必要系统工具 + Node + Python +# 安装必要系统工具 RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ && echo "${TZ}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && apt-get update \ && apt-get install -y --no-install-recommends \ - tzdata git gcc curl wget vim nodejs htop npm python3 python3-venv python3-pip \ + tzdata git gcc curl wget vim htop ca-certificates rsync \ + build-essential libssl-dev zlib1g-dev libbz2-dev \ + libreadline-dev libsqlite3-dev libncursesw5-dev \ + xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \ && rm -rf /var/lib/apt/lists/* + +# 安装 mise +RUN curl https://mise.run | MISE_INSTALL_PATH=/usr/local/bin/mise sh + +# 使用 mise 安装最新版本的 Node.js 和 Python +# 暂时安装到 /opt/mise-base,启动时会复制到 /app/envs/mise +ENV MISE_DATA_DIR=/opt/mise-base +ENV MISE_CONFIG_DIR=/opt/mise-base +ENV MISE_HTTP_TIMEOUT=300 +RUN (mise use -g node@latest python@latest || mise use -g node@latest python@latest || mise use -g node@latest python@latest) \ + && mise prune -- -f diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index fe73842..fc075a1 100644 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -3,8 +3,7 @@ set -e export LANG=C.UTF-8 export LC_ALL=C.UTF-8 -PYTHON_VENV_DIR="/app/envs/python" -NODE_ENV_DIR="/app/envs/node" +MISE_DIR="/app/envs/mise" echo "[entrypoint] Starting environment initialization..." @@ -15,66 +14,42 @@ mkdir -p \ /app/data \ /app/data/scripts \ /app/configs \ - /app/envs \ - "$NODE_ENV_DIR" + /app/envs # ============================ -# Python 虚拟环境(后台并行) +# Mise 环境初始化 # ============================ -( - if [ ! -x "$PYTHON_VENV_DIR/bin/python" ]; then - echo "[entrypoint][Python3] Creating Python virtual environment..." - python3 -m venv "$PYTHON_VENV_DIR" - "$PYTHON_VENV_DIR/bin/pip" config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple - "$PYTHON_VENV_DIR/bin/pip" install --upgrade pip setuptools wheel - echo "[entrypoint][Python3] Python venv created" - else - echo "[entrypoint][Python3] Python venv exists" - fi -) & -PYTHON_PID=$! +if [ ! -d "$MISE_DIR" ] || [ -z "$(ls -A "$MISE_DIR")" ]; then + echo "[entrypoint][Mise] Initializing mise environment from base..." + mkdir -p "$MISE_DIR" + # 使用 rsync 同步,更好地处理 Mac 挂载目录的大小写冲突,并跳过已存在文件 + rsync -a --ignore-existing /opt/mise-base/ "$MISE_DIR/" || true + echo "[entrypoint][Mise] Mise environment initialized" +else + echo "[entrypoint][Mise] Mise environment exists at $MISE_DIR" +fi # ============================ -# Node 环境(后台并行) +# 环境变量注入 # ============================ -( - echo "[entrypoint][Nodejs] Initializing Node npm prefix..." - # npm 全局安装目录 → /app/envs/node - npm config set prefix "$NODE_ENV_DIR" - # npm 行为优化(防内存暴涨) - npm config set registry https://registry.npmmirror.com - npm config set audit false - npm config set fund false - npm config set progress false - npm config set maxsockets 2 - echo "[entrypoint][Nodejs] Node npm configured" -) & -NODE_PID=$! +export MISE_DATA_DIR="$MISE_DIR" +export MISE_CONFIG_DIR="$MISE_DIR" +export PATH="$MISE_DIR/shims:$MISE_DIR/bin:$PATH" -# 等待两个后台任务完成 -echo "[entrypoint] Waiting for environment initialization..." -wait $PYTHON_PID -wait $NODE_PID -echo "[entrypoint] Environment initialization completed" +# 默认启用 Python 镜像源 +export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple # Node 内存限制 export NODE_OPTIONS="--max-old-space-size=256" - -# ============================ -# 环境变量注入(等价 activate) -# ============================ -export PATH="$PYTHON_VENV_DIR/bin:$NODE_ENV_DIR/bin:$PATH" -export NODE_PATH="$NODE_ENV_DIR/lib/node_modules" export PYTHONPATH=/app/data/scripts:$PYTHONPATH # ============================ # 打印确认 # ============================ -echo "[entrypoint][Python3] python: $(which python)" -echo "[entrypoint][Python3] pip: $(which pip)" -echo "[entrypoint][Nodejs] node: $(which node)" -echo "[entrypoint][Nodejs] npm prefix: $(npm config get prefix)" -echo "[entrypoint][Nodejs] npm root: $(npm root -g)" +echo "[entrypoint][Mise] mise version: $(mise --version)" +echo "[entrypoint][Python3] python: $(python --version) at $(which python)" +echo "[entrypoint][Nodejs] node: $(node --version) at $(which node)" +echo "[entrypoint][Nodejs] npm: $(npm --version) at $(which npm)" # ============================ # 启动应用