Ctrl K
ComunidadGuías…

Dockerfile

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# QQ Agent Plus —— 应用镜像
#
# 只装运行期依赖;测试、文档、devDependencies 都在 .dockerignore 里排除。
# 入口先以 root 修正数据卷属主,再降权到 node 运行(见 docker/entrypoint.sh)。
#
# 国内网络:Docker Hub 不可直连时,用镜像站构建基础镜像层:
#   docker build --build-arg NODE_IMAGE=docker.1panel.live/library/node:22.23.3-bookworm-slim .
ARG NODE_IMAGE=node:22.23.3-bookworm-slim
FROM ${NODE_IMAGE}

# gosu:启动时降权;tzdata:控制台的本地时间与日志时区;ffmpeg:媒体处理
# (音频转写、视频抽帧、GIF 帧条、大图降采样)。ffmpeg 的依赖会让镜像大约多 470MB;
# 这是保留完整功能的代价,不提供精简变体。
RUN apt-get update \
 && apt-get install -y --no-install-recommends gosu tzdata ffmpeg \
 && rm -rf /var/lib/apt/lists/*

ENV NODE_ENV=production \
    QQ_AGENT_DATA_DIR=/data \
    QQ_AGENT_RUNTIME=docker \
    TZ=Asia/Shanghai

WORKDIR /app

# 先装依赖再拷源码:改业务代码时不必重装 node_modules。
COPY package.json package-lock.json ./
RUN npm ci --omit=dev --ignore-scripts --no-audit --no-fund \
 && npm cache clean --force

COPY . .
RUN chmod 0755 docker/entrypoint.sh \
 && mkdir -p /data \
 && chown -R node:node /data /app

LABEL org.opencontainers.image.title="QQ Agent Plus" \
      org.opencontainers.image.description="Linux QQ group agent (OneBot v11) with a web console" \
      org.opencontainers.image.source="https://github.com/sakurawwwxh/qq-agent-plus" \
      org.opencontainers.image.licenses="MIT"

EXPOSE 3210
STOPSIGNAL SIGTERM

# /healthz 是现成的免鉴权存活端点(只返回名称/版本/连接状态,不含配置)。
# 端口跟随 QQ_AGENT_SERVER_PORT,避免用户改端口后健康检查永远红。
HEALTHCHECK --interval=30s --timeout=5s --start-period=150s --retries=3 \
  CMD node -e "const p=process.env.QQ_AGENT_SERVER_PORT||3210;fetch('http://127.0.0.1:'+p+'/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"

# 入口以 root 开始,chown 数据卷后 exec 成 node;应用进程不是 root。
ENTRYPOINT ["/app/docker/entrypoint.sh"]