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 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
|
||||
|
||||
@ -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。
|
||||
|
||||
24
dockerfile
24
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"]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user