首页
/ Qinglong项目Docker镜像构建技术解析

Qinglong项目Docker镜像构建技术解析

2025-07-05 08:10:39作者:廉皓灿Ida

镜像构建概述

Qinglong项目的Dockerfile采用多阶段构建策略,通过精心设计的依赖管理和环境设置,构建出一个功能完备的定时任务管理平台容器镜像。该镜像基于Alpine Linux系统,具有轻量级和高性能的特点。

构建阶段分析

第一阶段:依赖构建(builder)

FROM python:3.11-alpine3.18 AS builder
COPY package.json .npmrc pnpm-lock.yaml /tmp/build/
RUN set -x \
  && apk update \
  && apk add nodejs npm git \
  && npm i -g pnpm@8.3.1 pm2 ts-node \
  && cd /tmp/build \
  && pnpm install --prod

这一阶段主要完成Node.js相关依赖的安装:

  1. 使用Alpine 3.18作为基础镜像
  2. 安装Node.js运行时和npm包管理器
  3. 全局安装pnpm(高性能包管理器)、pm2(进程管理器)和ts-node(TypeScript执行环境)
  4. 使用pnpm安装项目依赖

第二阶段:最终镜像构建

FROM python:3.11-alpine

主镜像同样基于Alpine Linux系统,但版本与构建阶段保持一致,确保兼容性。

镜像设置详解

元数据与参数设置

ARG QL_MAINTAINER="whyour"
LABEL maintainer="${QL_MAINTAINER}"
ARG QL_URL=https://github.com/${QL_MAINTAINER}/qinglong.git
ARG QL_BRANCH=develop
ARG PYTHON_SHORT_VERSION=3.11

这些设置定义了:

  • 维护者信息
  • 项目源码仓库地址
  • 默认使用develop分支
  • Python版本信息

环境变量设置

ENV QL_DIR=/ql \
  QL_BRANCH=${QL_BRANCH} \
  LANG=C.UTF-8 \
  SHELL=/bin/bash \
  PS1="\u@\h:\w \$ "

关键环境变量包括:

  • QL_DIR: 项目主目录
  • LANG: 设置UTF-8编码环境
  • SHELL: 默认shell为bash
  • PS1: 自定义shell提示符

系统依赖安装

RUN set -x \
  && apk update -f \
  && apk upgrade \
  && apk --no-cache add -f bash \
  coreutils \
  git \
  curl \
  wget \
  tzdata \
  perl \
  openssl \
  nginx \
  nodejs \
  jq \
  openssh \
  procps \
  netcat-openbsd \
  unzip \
  npm \
  && rm -rf /var/cache/apk/*

安装的系统工具包括:

  • 基础工具:bash、coreutils
  • 网络工具:curl、wget、netcat
  • 开发工具:git、nodejs、npm
  • 系统工具:procps(进程管理)、tzdata(时区数据)
  • 数据处理工具:jq(JSON处理器)

时区与Git设置

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  && echo "Asia/Shanghai" > /etc/timezone \
  && git config --global user.email "qinglong@users.noreply.github.com" \
  && git config --global user.name "qinglong" \
  && git config --global http.postBuffer 524288000
  1. 设置系统时区为上海(东八区)
  2. 配置Git全局用户信息
  3. 增大Git HTTP传输缓冲区大小(500MB)

项目源码部署

RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
  && cd ${QL_DIR} \
  && cp -f .env.example .env \
  && chmod 777 ${QL_DIR}/shell/*.sh \
  && chmod 777 ${QL_DIR}/docker/*.sh \
  && git clone --depth=1 -b ${QL_BRANCH} https://github.com/${QL_MAINTAINER}/qinglong-static.git /static \
  && mkdir -p ${QL_DIR}/static \
  && cp -rf /static/* ${QL_DIR}/static \
  && rm -rf /static
  1. 克隆Qinglong项目源码到/ql目录
  2. 复制环境变量示例文件
  3. 设置shell脚本可执行权限
  4. 克隆静态资源并部署到正确位置

路径与环境设置

ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
  PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
  PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3

ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin \
  NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules \
  PIP_CACHE_DIR=${PYTHON_HOME}/pip \
  PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages

精心设置了各种路径环境:

  • 将依赖缓存目录设置在/ql/data下,便于持久化
  • 扩展PATH包含自定义工具路径
  • 配置Node.js和Python的模块查找路径

健康检查与入口点

HEALTHCHECK --interval=5s --timeout=2s --retries=20 \
  CMD curl -sf --noproxy '*' http://127.0.0.1:5600/api/health || exit 1

ENTRYPOINT ["./docker/docker-entrypoint.sh"]
  1. 健康检查:每5秒检查一次API健康状态
  2. 使用自定义入口点脚本启动容器

技术亮点

  1. 多阶段构建:分离依赖安装和最终镜像,减小镜像体积
  2. 依赖管理:同时支持Node.js(pnpm)和Python(pip)生态
  3. 路径隔离:用户级依赖与系统依赖分离,避免冲突
  4. 持久化设计:/ql/data目录作为卷,便于数据保存
  5. 健康检查:完善的容器健康监控机制

最佳实践建议

  1. 构建时可通过--build-arg参数指定不同分支
  2. 持久化/ql/data目录确保数据安全
  3. 自定义环境变量可覆盖默认设置
  4. 时区设置可根据实际需求调整
  5. 健康检查参数可根据业务需求调整频率和超时

通过这份Dockerfile,Qinglong项目实现了开箱即用的容器化部署方案,为开发者提供了稳定可靠的运行环境。