From 689dae40a1b39dbfad48374c3283e39630d30be6 Mon Sep 17 00:00:00 2001 From: sunlei Date: Sat, 16 May 2026 01:46:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=90=8E=E7=AB=AF=20D?= =?UTF-8?q?ocker=20=E9=95=9C=E5=83=8F=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 10 +++++++ ci/jenkins-agent/Dockerfile | 7 +++++ ci/jenkins-agent/README.md | 54 ++++++++++++++++++++++++++++++++----- dockerfile | 24 +++++++++-------- 4 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1e9c8b5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +node_modules +dist +coverage +logs +*.log +.git +.gitignore +.env +.env.* +!.env.example diff --git a/ci/jenkins-agent/Dockerfile b/ci/jenkins-agent/Dockerfile index 125847f..3e1037d 100644 --- a/ci/jenkins-agent/Dockerfile +++ b/ci/jenkins-agent/Dockerfile @@ -4,6 +4,7 @@ USER root ARG NODE_MAJOR=22 ARG PNPM_VERSION=9 +ARG GIT_SSH_HOST=github.com RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates curl git gnupg openssh-client \ @@ -22,6 +23,12 @@ RUN apt-get update \ && pnpm --version \ && docker --version \ && docker compose version \ + && mkdir -p /root/.ssh /home/jenkins/.ssh /etc/ssh \ + && ssh-keyscan -t rsa,ecdsa,ed25519 ${GIT_SSH_HOST} | tee /etc/ssh/ssh_known_hosts /root/.ssh/known_hosts /home/jenkins/.ssh/known_hosts >/dev/null \ + && chmod 700 /root/.ssh /home/jenkins/.ssh \ + && chmod 644 /root/.ssh/known_hosts /home/jenkins/.ssh/known_hosts \ + && chmod 644 /etc/ssh/ssh_known_hosts \ + && chown -R jenkins:jenkins /home/jenkins/.ssh \ && rm -rf /var/lib/apt/lists/* USER jenkins diff --git a/ci/jenkins-agent/README.md b/ci/jenkins-agent/README.md index 2ad1a20..987adaa 100644 --- a/ci/jenkins-agent/README.md +++ b/ci/jenkins-agent/README.md @@ -9,6 +9,7 @@ Agent 镜像内置: - Node.js 22 - pnpm 9 - Docker CLI / Buildx / Compose plugin +- `github.com` SSH known_hosts 项目业务镜像仍然使用仓库根目录的 `dockerfile`。本目录的 Dockerfile 是给 Jenkins Agent 用的,不是后端服务运行镜像。 @@ -40,13 +41,22 @@ agent { label 'kt-node-agent' } docker build -t kt-jenkins-agent:node22 -f ci/jenkins-agent/Dockerfile ci/jenkins-agent ``` -## NAS 侧启动 Agent - -如果 Jenkins Controller 容器名是 `jenkins`,并且你希望 Agent 通过 Docker 网络访问 Jenkins,可以先准备网络: +如果 Git 仓库不是 GitHub,可以在构建时覆盖 SSH host: ```bash -docker network create jenkins -docker network connect jenkins jenkins +docker build \ + --build-arg GIT_SSH_HOST=你的Git服务器域名 \ + -t kt-jenkins-agent:node22 \ + -f ci/jenkins-agent/Dockerfile \ + ci/jenkins-agent +``` + +## NAS 侧启动 Agent + +如果 Jenkins Controller 使用你当前的 compose 启动,默认网络是 `jenkins_default`。先确认网络存在: + +```bash +docker network ls | grep jenkins_default ``` 启动 Agent 容器。你的 Jenkins Controller compose 暴露的是 `18080:8080`,如果 Agent 和 Jenkins 在同一个 Docker 网络,容器内仍然使用 `http://jenkins:8080/`;如果 Agent 不在同一个网络,使用 NAS/服务器可访问地址,例如 `http://Jenkins服务器IP:18080/`。 @@ -55,7 +65,7 @@ docker network connect jenkins jenkins docker run -d \ --name kt-node-agent \ --restart=always \ - --network jenkins \ + --network jenkins_default \ -u root \ -e JENKINS_URL=http://jenkins:8080/ \ -e JENKINS_AGENT_NAME=kt-node-agent \ @@ -89,3 +99,35 @@ Manage Jenkins -> Nodes -> kt-node-agent ``` 节点在线后,多分支流水线点击构建即可进入 CI 阶段。 + +## 常见问题 + +如果 Jenkins checkout 时报错: + +```text +No ED25519 host key is known for github.com +Host key verification failed. +``` + +说明 Agent 容器缺少 Git 服务器的 SSH host key。当前 Dockerfile 已在镜像构建时写入 `github.com` 的用户级 `known_hosts` 和系统级 `/etc/ssh/ssh_known_hosts`。重新构建镜像并重启 Agent: + +```bash +docker build --no-cache -t kt-jenkins-agent:node22 -f ci/jenkins-agent/Dockerfile ci/jenkins-agent +docker rm -f kt-node-agent +``` + +然后按上面的 `docker run` 命令重新启动 Agent。 + +重启后可以先检查容器里是否已经写入 GitHub host key: + +```bash +docker exec kt-node-agent sh -lc 'ssh-keygen -F github.com -f /etc/ssh/ssh_known_hosts && ssh-keygen -F github.com -f /root/.ssh/known_hosts' +``` + +如果仍然报同样错误,去 Jenkins 页面把 Git Host Key Verification 改成手动提供或首次接受: + +```text +Manage Jenkins -> Security -> Git Host Key Verification Configuration +``` + +推荐先选 `Accept first connection strategy` 验证链路;更严格的做法是选手动提供 GitHub host keys。 diff --git a/dockerfile b/dockerfile index 6cad8ea..526ca62 100644 --- a/dockerfile +++ b/dockerfile @@ -1,19 +1,21 @@ -# 引用基础镜像 -FROM node:22.14.0-release +# 引用 Node 22 官方 Debian slim 镜像,避免非官方 tag 在镜像源里解析失败 +FROM node:22-bookworm-slim # 指定工作目录 WORKDIR /app -# 拷贝文件 +# 先拷贝依赖清单,利用 Docker 缓存加速依赖安装 +COPY package.json pnpm-lock.yaml ./ + +# 项目使用 pnpm-lock.yaml,镜像内也统一使用 pnpm 安装依赖 +RUN corepack enable \ + && corepack prepare pnpm@9 --activate \ + && pnpm install --frozen-lockfile + +# 拷贝业务代码 COPY . . -# 安装依赖 -RUN npm install - -RUN npm install pm2 -g - -# # 声明暴露端口号 +# 声明暴露端口号 EXPOSE 48085 -CMD npm run start:prod - +CMD ["pnpm", "run", "start:prod"]