feat: add mise base

This commit is contained in:
engigu
2026-02-12 12:10:44 +08:00
parent 5e1ea6b93f
commit be6a490a19
8 changed files with 87 additions and 77 deletions
+11 -4
View File
@@ -97,19 +97,25 @@ deps:
# Docker build # Docker build
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: docker-run:
docker run -p 8052:8052 $(BINARY) docker run -p 8052:8052 baihu:dev
# Docker compose up # Docker compose up
docker-up: docker-up:
docker-compose -f docker/docker-compose.yml up -d docker-compose up -d
# Docker compose down # Docker compose down
docker-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
help: help:
@@ -124,4 +130,5 @@ help:
@echo " docker-run - Run Docker container" @echo " docker-run - Run Docker container"
@echo " docker-up - Start Docker Compose stack" @echo " docker-up - Start Docker Compose stack"
@echo " docker-down - Stop 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" @echo " help - Show this help message"
@@ -1,6 +1,8 @@
services: services:
baihu: baihu:
build: . build:
context: .
dockerfile: docker/Dockerfile
ports: ports:
- "8052:8052" - "8052:8052"
volumes: volumes:
+1 -2
View File
@@ -115,8 +115,7 @@ FROM ghcr.io/engigu/baihu:${BASE_TAG}
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
ENV LANG=C.UTF-8 ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8 ENV LC_ALL=C.UTF-8
ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH"
ENV NODE_PATH="/app/envs/node/lib/node_modules"
# # 安装必要系统工具 + Node + Python # # 安装必要系统工具 + Node + Python
# RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ # RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \
+16 -15
View File
@@ -1,24 +1,25 @@
FROM alpine:3.19 FROM alpine:3.19
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH"
ENV NODE_PATH="/app/envs/node/lib/node_modules"
# 安装必要系统工具 + Node + Python # 安装必要系统工具
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
&& apk add --no-cache \ && apk add --no-cache \
tzdata \ tzdata git bash curl wget vim htop ca-certificates rsync \
git \ # Python build dependencies
gcc \ build-base libffi-dev openssl-dev bzip2-dev zlib-dev readline-dev sqlite-dev ncurses-dev xz-dev \
musl-dev \
curl \
wget \
vim \
nodejs \
npm \
python3 \
py3-pip \
htop \
&& cp /usr/share/zoneinfo/${TZ} /etc/localtime \ && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo "${TZ}" > /etc/timezone \ && echo "${TZ}" > /etc/timezone \
&& rm -rf /var/cache/apk/* && 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
+17 -4
View File
@@ -1,15 +1,28 @@
FROM debian:bookworm-slim FROM debian:bookworm-slim
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH"
ENV NODE_PATH="/app/envs/node/lib/node_modules"
# 安装必要系统工具 + Node + Python # 安装必要系统工具
RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ 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 \ && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \
&& echo "${TZ}" > /etc/timezone \ && echo "${TZ}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& apt-get update \ && apt-get update \
&& apt-get install -y --no-install-recommends \ && 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/* && 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
+17 -4
View File
@@ -1,15 +1,28 @@
FROM debian:trixie-slim FROM debian:trixie-slim
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
ENV PATH="/app/envs/node/bin:/app/envs/python/bin:$PATH" ENV PATH="/app/envs/mise/shims:/app/envs/mise/bin:$PATH"
ENV NODE_PATH="/app/envs/node/lib/node_modules"
# 安装必要系统工具 + Node + Python # 安装必要系统工具
RUN sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \ 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 \ && sed -i 's@security.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \
&& echo "${TZ}" > /etc/timezone \ && echo "${TZ}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
&& apt-get update \ && apt-get update \
&& apt-get install -y --no-install-recommends \ && 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/* && 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
+22 -47
View File
@@ -3,8 +3,7 @@ set -e
export LANG=C.UTF-8 export LANG=C.UTF-8
export LC_ALL=C.UTF-8 export LC_ALL=C.UTF-8
PYTHON_VENV_DIR="/app/envs/python" MISE_DIR="/app/envs/mise"
NODE_ENV_DIR="/app/envs/node"
echo "[entrypoint] Starting environment initialization..." echo "[entrypoint] Starting environment initialization..."
@@ -15,66 +14,42 @@ mkdir -p \
/app/data \ /app/data \
/app/data/scripts \ /app/data/scripts \
/app/configs \ /app/configs \
/app/envs \ /app/envs
"$NODE_ENV_DIR"
# ============================ # ============================
# Python 虚拟环境(后台并行) # Mise 环境初始化
# ============================ # ============================
( if [ ! -d "$MISE_DIR" ] || [ -z "$(ls -A "$MISE_DIR")" ]; then
if [ ! -x "$PYTHON_VENV_DIR/bin/python" ]; then echo "[entrypoint][Mise] Initializing mise environment from base..."
echo "[entrypoint][Python3] Creating Python virtual environment..." mkdir -p "$MISE_DIR"
python3 -m venv "$PYTHON_VENV_DIR" # 使用 rsync 同步,更好地处理 Mac 挂载目录的大小写冲突,并跳过已存在文件
"$PYTHON_VENV_DIR/bin/pip" config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple rsync -a --ignore-existing /opt/mise-base/ "$MISE_DIR/" || true
"$PYTHON_VENV_DIR/bin/pip" install --upgrade pip setuptools wheel echo "[entrypoint][Mise] Mise environment initialized"
echo "[entrypoint][Python3] Python venv created" else
else echo "[entrypoint][Mise] Mise environment exists at $MISE_DIR"
echo "[entrypoint][Python3] Python venv exists" fi
fi
) &
PYTHON_PID=$!
# ============================ # ============================
# Node 环境(后台并行) # 环境变量注入
# ============================ # ============================
( export MISE_DATA_DIR="$MISE_DIR"
echo "[entrypoint][Nodejs] Initializing Node npm prefix..." export MISE_CONFIG_DIR="$MISE_DIR"
# npm 全局安装目录 → /app/envs/node export PATH="$MISE_DIR/shims:$MISE_DIR/bin:$PATH"
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=$!
# 等待两个后台任务完成 # 默认启用 Python 镜像源
echo "[entrypoint] Waiting for environment initialization..." export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
wait $PYTHON_PID
wait $NODE_PID
echo "[entrypoint] Environment initialization completed"
# Node 内存限制 # Node 内存限制
export NODE_OPTIONS="--max-old-space-size=256" 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 export PYTHONPATH=/app/data/scripts:$PYTHONPATH
# ============================ # ============================
# 打印确认 # 打印确认
# ============================ # ============================
echo "[entrypoint][Python3] python: $(which python)" echo "[entrypoint][Mise] mise version: $(mise --version)"
echo "[entrypoint][Python3] pip: $(which pip)" echo "[entrypoint][Python3] python: $(python --version) at $(which python)"
echo "[entrypoint][Nodejs] node: $(which node)" echo "[entrypoint][Nodejs] node: $(node --version) at $(which node)"
echo "[entrypoint][Nodejs] npm prefix: $(npm config get prefix)" echo "[entrypoint][Nodejs] npm: $(npm --version) at $(which npm)"
echo "[entrypoint][Nodejs] npm root: $(npm root -g)"
# ============================ # ============================
# 启动应用 # 启动应用