mirror of
https://github.com/KwiTsukasa/kt-template-online-api.git
synced 2026-05-27 15:44:54 +08:00
fix: 修复后端 Docker 镜像构建
This commit is contained in:
parent
a3b03ee0b9
commit
689dae40a1
10
.dockerignore
Normal file
10
.dockerignore
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
coverage
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
@ -4,6 +4,7 @@ USER root
|
|||||||
|
|
||||||
ARG NODE_MAJOR=22
|
ARG NODE_MAJOR=22
|
||||||
ARG PNPM_VERSION=9
|
ARG PNPM_VERSION=9
|
||||||
|
ARG GIT_SSH_HOST=github.com
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends ca-certificates curl git gnupg openssh-client \
|
&& apt-get install -y --no-install-recommends ca-certificates curl git gnupg openssh-client \
|
||||||
@ -22,6 +23,12 @@ RUN apt-get update \
|
|||||||
&& pnpm --version \
|
&& pnpm --version \
|
||||||
&& docker --version \
|
&& docker --version \
|
||||||
&& docker compose 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/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
USER jenkins
|
USER jenkins
|
||||||
|
|||||||
@ -9,6 +9,7 @@ Agent 镜像内置:
|
|||||||
- Node.js 22
|
- Node.js 22
|
||||||
- pnpm 9
|
- pnpm 9
|
||||||
- Docker CLI / Buildx / Compose plugin
|
- Docker CLI / Buildx / Compose plugin
|
||||||
|
- `github.com` SSH known_hosts
|
||||||
|
|
||||||
项目业务镜像仍然使用仓库根目录的 `dockerfile`。本目录的 Dockerfile 是给 Jenkins Agent 用的,不是后端服务运行镜像。
|
项目业务镜像仍然使用仓库根目录的 `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
|
docker build -t kt-jenkins-agent:node22 -f ci/jenkins-agent/Dockerfile ci/jenkins-agent
|
||||||
```
|
```
|
||||||
|
|
||||||
## NAS 侧启动 Agent
|
如果 Git 仓库不是 GitHub,可以在构建时覆盖 SSH host:
|
||||||
|
|
||||||
如果 Jenkins Controller 容器名是 `jenkins`,并且你希望 Agent 通过 Docker 网络访问 Jenkins,可以先准备网络:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker network create jenkins
|
docker build \
|
||||||
docker network connect jenkins jenkins
|
--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/`。
|
启动 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 \
|
docker run -d \
|
||||||
--name kt-node-agent \
|
--name kt-node-agent \
|
||||||
--restart=always \
|
--restart=always \
|
||||||
--network jenkins \
|
--network jenkins_default \
|
||||||
-u root \
|
-u root \
|
||||||
-e JENKINS_URL=http://jenkins:8080/ \
|
-e JENKINS_URL=http://jenkins:8080/ \
|
||||||
-e JENKINS_AGENT_NAME=kt-node-agent \
|
-e JENKINS_AGENT_NAME=kt-node-agent \
|
||||||
@ -89,3 +99,35 @@ Manage Jenkins -> Nodes -> kt-node-agent
|
|||||||
```
|
```
|
||||||
|
|
||||||
节点在线后,多分支流水线点击构建即可进入 CI 阶段。
|
节点在线后,多分支流水线点击构建即可进入 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。
|
||||||
|
|||||||
24
dockerfile
24
dockerfile
@ -1,19 +1,21 @@
|
|||||||
# 引用基础镜像
|
# 引用 Node 22 官方 Debian slim 镜像,避免非官方 tag 在镜像源里解析失败
|
||||||
FROM node:22.14.0-release
|
FROM node:22-bookworm-slim
|
||||||
|
|
||||||
# 指定工作目录
|
# 指定工作目录
|
||||||
WORKDIR /app
|
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 . .
|
COPY . .
|
||||||
|
|
||||||
# 安装依赖
|
# 声明暴露端口号
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
RUN npm install pm2 -g
|
|
||||||
|
|
||||||
# # 声明暴露端口号
|
|
||||||
EXPOSE 48085
|
EXPOSE 48085
|
||||||
|
|
||||||
CMD npm run start:prod
|
CMD ["pnpm", "run", "start:prod"]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user