Files
AIclinicalresearch/docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

612 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Node.js <20>𡒊垢 - Docker <20>𨅯<EFBFBD><F0A885AF><EFBFBD><EFBFBD><EFBFBD><E6BBA2><EFBFBD>
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦**: v1.0
**<EFBFBD>𥕦遣<EFBFBD>園𡢿**: 2024-12-24
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>凒**: AIclinicalresearch 撟喳蝱 - Node.js <20>𡒊垢<F0A1928A>滚𦛚
**<EFBFBD><EFBFBD>霂餉<EFBFBD>?*: 餈鞟輕撌亦<E6928C><EFBFBD><E692A3><EFBFBD><EFBFBD>蝡臬<E89DA1><E887AC>穃極蝔见<E89D94>
---
## <20><> <20><EFBFBD>
1. [<EFBFBD><EFBFBD>遣璁<EFBFBD>](#<23><>遣璁<E981A3>)
2. [<EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>](#<23>滨蔭<E6BBA8><E894AD><EFBFBD>)
3. [<EFBFBD><EFBFBD>遣瘚<EFBFBD><EFBFBD>](#<23><>遣瘚<E981A3><E7989A>)
4. [<EFBFBD>𨅯<EFBFBD>靽⊥<EFBFBD>](#<23>𨅯<EFBFBD>靽⊥<E99DBD>)
5. [<EFBFBD><EFBFBD><EFBFBD><EFBFBD>埝䰻](#<23><><EFBFBD><EFBFBD>埝䰻)
6. [<5B><>雿喳<E99BBF>頝琶(#<23><>雿喳<E99BBF>頝?
---
## 1. <20><>遣璁<E981A3>
### 1.1 <20><>遣蝑𣇉裦
<EFBFBD>祆活<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鍂**<2A><EFBFBD><E5AFA1><EFBFBD>䲮獢㇂嚗<E38782>𧋦<EFBFBD><EFBFBD>霂?Docker<65><EFBFBD>嚗?*嚗𣬚㮾瘥𥪯<E798A5><EFBFBD>䲮獢<E4B2AE><E78DA2>隞乩<E99A9E>隡睃飵嚗?
| 撖寞<E69296>憿?| 隡删<E99AA1><E588A0><EFBFBD> | <20><EFBFBD><E5AFA1><EFBFBD>䲮獢㇂ |
|--------|----------|-------------|
| **TypeScript蝻𤥁<E89DBB>** | Docker銝剜<E98A9D>銵?| <20>砍𧑐憸<F0A79190><E686B8>霂?<3F>?|
| **靘肽<E99D98>摰㕑<E691B0>** | 摰峕㟲靘肽<E99D98> | 隞<><E99A9E>鈭找<E988AD>韏?<3F>?|
| **蝵𤑳<E89DB5>靘肽<E99D98>** | 擃矋<E69383><E79F8B><EFBFBD><E6A09E><EFBFBD> | 雿𠬍<E99BBF><F0A0AC8D>渡迅摰𡄯<E691B0> <20>?|
| **<EFBFBD><EFBFBD><EFBFBD>園𡢿** | ~10<31><30><EFBFBD> | ~5<><35><EFBFBD> <20>?|
| **撟喳蝱<E596B3>澆捆<E6BE86>?* | <20><EFBFBD><E58EB0>?| <20>𣳇<EFBFBD><F0A3B387>?<3F>?|
### 1.2 <20><><EFBFBD><EFBFBD>
```
<EFBFBD>𨅯<EFBFBD><EFBFBD>滨妍: backend-service:v1.0
<EFBFBD>𨅯<EFBFBD>憭批<EFBFBD>: 838MB (<28>讠憬<E8AEA0>?~186MB)
<EFBFBD>𨅯<EFBFBD>ID: a4ffb61c15af
<EFBFBD><EFBFBD><EFBFBD>園𡢿: ~5<><35><EFBFBD>
ACR<EFBFBD><EFBFBD>: crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
```
---
## 2. <20>滨蔭<E6BBA8><E894AD><EFBFBD>
### 2.1 <20><EFBFBD><EFBFBD><E79289>?
```powershell
# 1. 璉<><E79289>主ocker<65><EFBFBD>?
docker --version
docker ps
# 2. 璉<><E79289>代ode.js<6A><EFBFBD>
node --version # 摨磰砲<E7A3B0>曄內 v22.x
npm --version
# 3. 蝖株恕敶枏<E695B6><E69E8F><EFBFBD>
cd D:\MyCursor\AIclinicalresearch\backend
```
### 2.2 隞<><E99A9E><EFBFBD><EFBFBD><EFBFBD>
#### <20>?敹<>◆摰峕<E691B0><E5B395><EFBFBD>郊撉?
**甇仿炊1嚗䥪risma<6D><EFBFBD><E6BB9A>峕郊嚗<E9838A><E59A97>憿鳴<E686BF>**
```powershell
# 霈曄蔭銝湔𧒄RDS餈墧𦻖<E5A2A7><EFBFBD><E887AC><EFBFBD>
$env:DATABASE_URL = "postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5oo.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10"
# <20><EFBFBD>Prisma<6D><EFBFBD><E6BB9A>峕郊
npx prisma db pull
# 颲枏枂摨磰砲<E7A3B0>曄內嚗?
# <20>?Introspected 32 models and wrote them into prisma\schema.prisma
```
**甇仿炊2嚗𡁶<E59A97><F0A181B6>辥risma Client**
```powershell
npx prisma generate
# 颲枏枂摨磰砲<E7A3B0>曄內嚗?
# <20>?Generated Prisma Client (v6.17.0)
```
**甇仿炊3嚗関ypeScript蝻𤥁<E89DBB><EFBFBD><E59A97>憿鳴<E686BF>**
```powershell
# 蝻𤥁<E89DBB>TypeScript隞<74><E99A9E>
npm run build
# <20>𣂼<EFBFBD>颲枏枂嚗?
# > ai-clinical-backend@1.0.0 build
# > tsc
# (<28>𣳇<EFBFBD>霂臭縑<E887AD>?
# 璉<><E79289>卡ist<73><EFBFBD><E6A180>臬炏<E887AC><E7828F><EFBFBD>
ls dist
```
<EFBFBD>𩤃<EFBFBD> **<EFBFBD><EFBFBD><EFBFBD>鞟內**嚗𡁜<E59A97><F0A1819C>𦦵<EFBFBD>霂穃仃韐伐<E99F90><EFBFBD><EFBFBD><E29786>耨憭齿<E686AD><E9BDBF>凤ypeScript<70>躰秤嚗?
---
## 3. <20><>遣瘚<E981A3><E7989A>
### 3.1 摰峕㟲<E5B395><E39FB2>遣甇仿炊
```powershell
# 1. 蝖桐<E89D96><E6A190>灸ackend<6E><EFBFBD>
cd D:\MyCursor\AIclinicalresearch\backend
# 2. 璉<><E79289>主ockerfile<6C>?dockerignore
ls Dockerfile
ls .dockerignore
# 3. 撘<>憪𧢲<E686AA>撱綽<E692B1><E7B6BD><EFBFBD>閬?<3F><><EFBFBD>嚗?
docker build -t backend-service:v1.0 .
# 4. <20><EFBFBD><E4BAA6><EFBFBD>遣蝏𤘪<E89D8F>
docker images backend-service:v1.0
```
### 3.2 <20><>遣餈<E981A3><E9A488>霂湔<E99C82>
**<EFBFBD>嗆挾1嚗帋<EFBFBD>韏硋<EFBFBD><EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗?*
```dockerfile
FROM node:alpine AS builder
RUN apk add --no-cache openssl
COPY package*.json ./
COPY prisma ./prisma/
RUN npm ci --production # 隞<><E99A9E><EFBFBD><E98B86>鈭找<E988AD>韏?
RUN npx prisma generate # <20><><EFBFBD>Prisma Client
```
**<EFBFBD>嗆挾2嚗𡁜<EFBFBD><EFBFBD>嗆𧋦<EFBFBD><EFBFBD>霂𤑳<EFBFBD><EFBFBD><EFBFBD>蝥?0蝘𡜐<E89D98>**
```dockerfile
COPY dist ./dist # 憭滚<E686AD><E6BB9A>砍𧑐撌脩<E6928C>霂𤑳<E99C82>TypeScript隞<74><E99A9E>
```
**<EFBFBD>嗆挾3嚗朞<EFBFBD>銵屸<EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗?*
```dockerfile
FROM node:alpine
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
```
### 3.3 <20><EFBFBD><E588B8><EFBFBD>ACR
```powershell
# 1. <20><EFBFBD>ACR嚗<52><EFBFBD>其葵鈭箇<E988AD>摰硺<E691B0><E7A1BA><EFBFBD>嚗?
echo "fengzhibo117" | docker login --username=gofeng117@163.com --password-stdin crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
# 颲枏枂嚗匁ogin Succeeded
# 2. <20>𤘪<EFBFBD>蝑?
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
# 3. <20><EFBFBD><E588B8><EFBFBD><EFBFBD>?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
# 颲枏枂嚗?
# v1.0: digest: sha256:a4ffb61c15af... size: 856
# latest: digest: sha256:a4ffb61c15af... size: 856
```
---
## 4. <20>𨅯<EFBFBD>靽⊥<E99DBD>
### 4.1 <20>𨅯<EFBFBD><F0A885AF><EFBFBD>
**VPC<50><43><EFBFBD><EFBFBD><EFBFBD>嚗𠄎AE<41>函蔡雿輻鍂嚗㚁<E59A97>**
```
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
```
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗㚁<EFBFBD>**
```
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
```
### 4.2 <20>𨅯<EFBFBD>霂行<E99C82>
```yaml
<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>: sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941
憭批<EFBFBD>: 838MB (<28>讠憬<E8AEA0>?~186MB)
<EFBFBD><EFBFBD>: linux/amd64
<EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD>: node:alpine
Node<EFBFBD><EFBFBD>𧋦: 22.x
<EFBFBD><EFBFBD>: v1.0, latest
```
### 4.3 <20>𨅯<EFBFBD><F0A885AF><EFBFBD>
```
/app/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> node_modules/ # <20>煺漣靘肽<E99D98>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> dist/ # 蝻𤥁<E89DBB><F0A4A581>𡒊<EFBFBD>JS隞<53><E99A9E>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> prisma/ # Prisma Schema
<EFBFBD>? <20><EFBFBD><E5A999><EFBFBD> schema.prisma
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> package.json
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> uploads/ # 銝湔𧒄<E6B994><F0A79284><EFBFBD><EFBFBD>
```
### 4.4 <20>臬𢆡<E887AC>賭誘
```dockerfile
CMD ["node", "dist/index.js"]
```
### 4.5 <20>亙熒璉<E78692><E79289>?
```dockerfile
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
```
---
## 5. <20><><EFBFBD><EFBFBD>埝䰻
### 5.1 撣貉<E692A3><E8B289><EFBFBD>
#### <20>?<3F><EFBFBD>1嚗関ypeScript蝻𤥁<E89DBB>憭梯揖
**<EFBFBD><EFBFBD>𠶖嚗?*
```
error TS2554: Expected 2-3 arguments, but got 1.
error TS2322: Type 'XXX' is not assignable to type 'YYY'.
```
**<EFBFBD><EFBFBD>嚗?*
- Prisma<6D><EFBFBD><E6BB9A>峕郊<E5B395>𡒊撩撠穃<E692A0>蝟餃<E89D9F>畾?
-<><E99A9E>銝窰risma<6D><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A1A4><EFBFBD>
**閫<><E996AB><EFBFBD><EFBFBD>嚗?*
```powershell
# 1. <20>齿鰵<E9BDBF>峕郊Prisma
npx prisma db pull
npx prisma generate
# 2. <20>齿鰵蝻𤥁<E89DBB>
npm run build
# 3. 憒<><E68692>餈䀹<E9A488><E480B9>躰秤嚗峕<E59A97><E5B395>另sconfig.json<6F>滨蔭
```
#### <20>?<3F><EFBFBD>2嚗鋽ocker<65><72>遣蝵𤑳<E89DB5><EFBFBD>𧒄
**<EFBFBD><EFBFBD>𠶖嚗?*
```
npm error code ECONNRESET
npm error network aborted
```
**<EFBFBD><EFBFBD>嚗?*
- npm<70>𨅯<EFBFBD>皞鞟<E79A9E>蝏靝<E89D8F>蝔喳<E89D94>
- npm ci 銝贝蝸靘肽<E99D98>憭梯揖
**閫<><E996AB><EFBFBD><EFBFBD>嚗?*
<EFBFBD>?**雿輻鍂<E8BCBB><EFBFBD><E5AFA1><EFBFBD>䲮獢㇂嚗<E38782>𧋦甈⊿<E79488><E28ABF><EFBFBD><E587BD><EFBFBD>嚗?*
- <20>砍𧑐憸<F0A79190><E686B8>霂𡢅<E99C82>頝唾<E9A09D>Docker銝剔<E98A9D>蝻𤥁<E89DBB>甇仿炊
- <20><EFBFBD><EFBFBD><E98B86>鈭找<E988AD>韏吔<E99F8F><E59094><EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1>
#### <20>?<3F><EFBFBD>3嚗𡁏綫<F0A1818F><E7B6AB><EFBFBD>ACR憭梯揖嚗?03 Forbidden嚗?
**<EFBFBD><EFBFBD>𠶖嚗?*
```
Error response from daemon: login attempt to https://registry.cn-beijing.aliyuncs.com/v2/ failed with status: 403 Forbidden
```
**<EFBFBD><EFBFBD>嚗?*
- 雿輻鍂鈭<E98D82><E988AD>霂舐<E99C82>ACR<43><EFBFBD>
- 摨磰砲雿輻鍂銝芯犖<E88AAF><E78A96><EFBFBD>靘见𧑐<E8A781><F0A79190>嚗䔶<E59A97><E494B6><EFBFBD>銝𡁶<E98A9D><F0A181B6><EFBFBD>
**閫<><E996AB><EFBFBD><EFBFBD>嚗?*
```powershell
# <20>?甇<><EFBFBD><EFBC86>蒈敶訫𧑐<E8A8AB><F0A79190><EFBFBD>葵鈭箇<E988AD>摰硺<E691B0>嚗?
docker login crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
# <20>?<3F>躰秤<E8BAB0><E7A7A4>蒈敶訫𧑐<E8A8AB><F0A79190><EFBFBD><E59A97>銝𡁶<E98A9D>嚗?
docker login registry.cn-beijing.aliyuncs.com
```
#### <20>?<3F><EFBFBD>4嚗间PC<50><43><EFBFBD><EFBFBD><EFBFBD><E595A3><EFBFBD><E588B8><EFBFBD><EFBFBD>?
**<EFBFBD><EFBFBD>𠶖嚗?*
```
failed to do request: Head "https://crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/...": net/http: TLS handshake timeout
```
**<EFBFBD><EFBFBD>嚗?*
- VPC<50><43><EFBFBD><EFBFBD><EFBFBD><E595A3><EFBFBD><E88ABE>券燵<E588B8><EFBFBD>VPC<50><43><EFBFBD>?
- <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><E68693>瘜閗挪<E99697>姬PC<50><43><EFBFBD>
**閫<><E996AB><EFBFBD><EFBFBD>嚗?*
```powershell
# <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><EFBFBD><EFBFBD>蝵穃𧑐<E7A983><F0A79190><EFBFBD><EFBFBD>?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
# SAE<41>函蔡<E587BD>嗡蝙<E597A1>汲PC<50><43><EFBFBD><EFBFBD><EFBFBD><E595A3><EFBFBD><EFBFBD>銁SAE<41><EFBFBD><E689B9><EFBFBD>蝵殷<E89DB5>
```
### 5.2 撉諹<E69289><E8ABB9>𨅯<EFBFBD>
```powershell
# 1. 璉<><E79289>仿<EFBFBD><E4BBBF>𤩺糓<F0A4A9BA><EFBFBD><E8A180>?
docker images backend-service:v1.0
# 2. <20><EFBFBD><E4BAA6>𨅯<EFBFBD>霂衣<E99C82>靽⊥<E99DBD>
docker inspect backend-service:v1.0
# 3. 瘚贝<E7989A>餈鞱<E9A488><E99EB1>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
docker run -d `
--name backend-test `
-p 3001:3001 `
-e DATABASE_URL="postgresql://..." `
-e NODE_ENV=production `
backend-service:v1.0
# 4. <20><EFBFBD>摰孵膥<E5ADB5><EFBFBD>
docker logs backend-test
# 5. 瘚贝<E7989A><E8B49D>亙熒璉<E78692><E79289>?
curl http://localhost:3001/health
# 6. 皜<><E79A9C>瘚贝<E7989A>摰孵膥
docker stop backend-test
docker rm backend-test
```
---
## 6. <20><>雿喳<E99BBF>頝?
### 6.1 <20><><EFBFBD>齿<EFBFBD><E9BDBF><EFBFBD><E4BAA4>?
- [ ] 撌脣<E6928C><E884A3>辥risma<6D><EFBFBD><E6BB9A>峕郊嚗Ǒnpx prisma db pull`嚗?
- [ ] 撌脩<E6928C><E884A9>辥risma Client嚗Ǒnpx prisma generate`嚗?
- [ ] TypeScript蝻𤥁<E89DBB><F0A4A581>𣂼<EFBFBD>嚗Ǒnpm run build`嚗?
- [ ] dist<73><EFBFBD>撌脩<E6928C><E884A9>𣂷<EFBFBD><F0A382B7><EFBFBD><EFBFBD><E98984><EFBFBD><EFBFBD>霂穃<E99C82><E7A983><EFBFBD>S<EFBFBD><53>
- [ ] Docker Desktop撌脣鍳<E884A3>典僎餈鞱<E9A488>
- [ ] 蝵𤑳<E89DB5>餈墧𦻖甇<F0A6BB96>
### 6.2 <20><>𧋦蝞∠<E89D9E>
**<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>倌閫<EFBFBD><EFBFBD>嚗?*
```
v1.0 - <20><EFBFBD><E5ADB5><EFBFBD>𧋦嚗<F0A78BA6><EFBFBD>鞟鍂鈭𡒊<E988AD>鈭抒㴓憓<E3B493><E68693>
latest - <20><><EFBFBD><EFBFBD><E59581>穿<EFBFBD><E7A9BF><EFBFBD>瘚贝<E7989A><E8B49D><EFBFBD>嚗?
v1.0.1 - Bug靽桀<E99DBD><E6A180><EFBFBD>𧋦
v1.1.0 - <20><EFBFBD><E8A098>湔鰵<E6B994><E9B0B5>𧋦
```
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
```powershell
# <20>煺漣<E785BA><EFBFBD><E887AC>函蔡嚗<E894A1><EFBFBD><E7B6AB>鸌摰𡁶<E691B0><F0A181B6>穿<EFBFBD>
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
# 瘚贝<E7989A><E8B49D><EFBFBD><E887AC>函蔡嚗<E894A1><E59A97><EFBFBD>嗆綫<E59786><E7B6AB>atest嚗?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
```
### 6.3 <20><>遣隡睃<E99AA1>
**1. <20>拍鍂Docker蝻枏<E89DBB>**
```dockerfile
# <20>?<3F><><EFBFBD><EFBFBD>酥ackage.json嚗<6E><EFBFBD><EFBFBD>韏𣇉<E99F8F>摮?
COPY package*.json ./
RUN npm ci --production
# <20>?<3F><><EFBFBD>𤾸<EFBFBD><F0A4BEB8>嗡誨<E597A1><E8AAA8><EFBFBD><EFBFBD><E99A9E><EFBFBD><EFBFBD>銝滚蔣<E6BB9A><EFBFBD>韏硋<E99F8F>蝻枏<E89DBB>
COPY dist ./dist
```
**2. 雿輻鍂.dockerignore**
```
node_modules
.env
.env.*
dist # <20>砍𧑐dist<73><EFBFBD>COPY<50><EFBFBD>憭滚<E686AD>
test
tests
*.md
.git
```
**3. 憭𡁻𧫴畾菜<E795BE>撱?*
```dockerfile
# <20>嗆挾1嚗帋<E59A97>韏硋<E99F8F>鋆?
FROM node:alpine AS builder
...
# <20>嗆挾2嚗朞<E59A97>銵峕𧒄<E5B395>𨅯<EFBFBD><EFBFBD>凒撠𧶏<E692A0>
FROM node:alpine
COPY --from=builder ...
```
### 6.4 摰匧<E691B0>撱箄悅
1. **銝滩<E98A9D><E6BBA9><EFBFBD><E588B8>譍葉<E8AD8D><E89189><EFBFBD>𤩺<EFBFBD>靽⊥<E99DBD>**
- <20>?銝滩<E98A9D><E6BBA9>𢲩.env`<60><>辣憭滚<E686AD><E6BB9A><EFBFBD><E59C88>?
- <20>?雿輻鍂SAE<41><EFBFBD><E887AC><EFBFBD>瘜典<E7989C><E585B8>滨蔭
2. **雿輻鍂<E8BCBB>𡇙oot<6F><EFBFBD>餈鞱<E9A488>**
```dockerfile
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs
```
3. **摰𡁏<E691B0><F0A1818F>湔鰵<E6B994><EFBFBD><E7AE87>𨅯<EFBFBD>**
```dockerfile
FROM node:alpine # 雿輻鍂<E8BCBB><E98D82><EFBFBD><EFBFBD>Alpine<6E><65>𧋦
```
---
## <20><><EFBFBD>A嚗鋽ockerfile摰峕㟲<E5B395><E39FB2>
```dockerfile
# ==================== <20>嗆挾 1: 靘肽<E99D98>摰㕑<E691B0><E39591>嗆挾 ====================
FROM node:alpine AS builder
# <20>踵揢Alpine<6E>𨅯<EFBFBD>皞𣂷蛹<F0A382B7><EFBFBD>鈭煾<E988AD><E785BE>𧶏<EFBFBD><EFBFBD><E996AB>蝵𤑳<E89DB5><F0A491B3><EFBFBD>嚗?
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 摰㕑<E691B0> Prisma 餈鞱<E9A488><E99EB1><EFBFBD>韏?
RUN apk add --no-cache openssl
WORKDIR /app
# 1. 憭滚<E686AD>靘肽<E99D98><E882BD><EFBFBD>
COPY package*.json ./
# 2. 憭滚<E686AD> Prisma Schema嚗<61>鍂鈭𡒊<E988AD><F0A1928A>辥risma Client嚗?
COPY prisma ./prisma/
# 3. <20><EFBFBD><EFBFBD><E98B86>鈭找<E988AD>韏吔<E99F8F>憭批<E686AD><E689B9><EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1><E3B098><EFBFBD><EFBFBD><EFBFBD>𧒄<EFBFBD><EFBFBD>
RUN npm config set registry https://registry.npmmirror.com && \
npm config set fetch-retry-mintimeout 20000 && \
npm config set fetch-retry-maxtimeout 120000 && \
npm config set fetch-retries 5 && \
npm ci --production --prefer-offline --no-audit
# 4. <20><><EFBFBD> Prisma Client嚗<74><E59A97>鈭抒㴓憓<E3B493><E68693><EFBFBD><E996AC>
RUN npx prisma generate
# 5. 憭滚<E686AD><E6BB9A>砍𧑐撌脩<E6928C>霂穃末<E7A983>?dist <20><>辣憭對<E686AD>頝唾<E9A09D>TypeScript蝻𤥁<E89DBB>嚗?
COPY dist ./dist
# ==================== <20>嗆挾 2: 餈鞱<E9A488><E99EB1>嗆挾 ====================
FROM node:alpine
# <20>踵揢Alpine<6E>𨅯<EFBFBD>皞𣂷蛹<F0A382B7><EFBFBD>鈭煾<E988AD><E785BE>𧶏<EFBFBD><EFBFBD><E996AB>蝵𤑳<E89DB5><F0A491B3><EFBFBD>嚗?
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 摰㕑<E691B0>餈鞱<E9A488><E99EB1><EFBFBD>韏?+ <20>嗅躹<E59785>唳旿
RUN apk add --no-cache \
openssl \
curl \
ca-certificates \
tzdata
# <20>𩤃<EFBFBD> 蝏煺<E89D8F><E785BA>嗅躹嚗鋫sia/Shanghai
ENV TZ=Asia/Shanghai
# <20>𥕦遣<F0A595A6>?root <20><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>雿喳<E99BBF>頝蛛<E9A09D>
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
# 隞擧<E99A9E>撱粹𧫴畾萄<E795BE><E89084>嗡漣<E597A1>?
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./
COPY --from=builder --chown=nodejs:nodejs /app/prisma ./prisma
# <20>𥕦遣銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD>鍂鈭𦒘葩<F0A69298><EFBFBD>隞塚<E99A9E>
RUN mkdir -p /app/uploads && chown -R nodejs:nodejs /app/uploads
# <20><><EFBFBD><EFBFBD> root <20><EFBFBD>
USER nodejs
# <20>亙熒璉<E78692><E79289>?
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
# <20>湧蠧蝡臬藁
EXPOSE 3001
# <20>𤣳 <20>臬𢆡<E887AC>賭誘嚗<E8AA98><E59A97><EFBFBD>臬𢆡摨𠉛鍂嚗䔶<E59A97><E494B6><EFBFBD><E689AF>唳旿摨栞<E691A8>蝘鳴<E89D98>
CMD ["node", "dist/index.js"]
```
---
## <20><><EFBFBD>B嚗?dockerignore摰峕㟲<E5B395><E39FB2>
```
# Node.js
node_modules
npm-debug.log
yarn-error.log
# 撘<><E69298><EFBFBD>隞?
.env
.env.*
*.local
# <20><>遣鈭抒<E988AD><EFBFBD>㺿餈𥟇䲮獢㇂嚗帋蝙<E5B88B>冽𧋦<E586BD><EFBFBD>霂穃末<E7A983><E69CAB>ist嚗?
# dist # <20><>𧒄瘜券<E7989C><E588B8><EFBFBD><E39A81><EFBFBD>捂憭滚<E686AD><E6BB9A>砍𧑐dist
# 瘚贝<E7989A><E8B49D><EFBFBD>
test
tests
*.test.ts
*.spec.ts
coverage
# <20><><EFBFBD>䔶葩<E494B6><EFBFBD>隞?
docs
*.md
.vscode
.idea
.DS_Store
Thumbs.db
# 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣嚗<E8BEA3><E59A97>銵峕𧒄<E5B395><F0A79284><EFBFBD>嚗?
uploads/*
# Git
.git
.gitignore
# <20><EFBFBD>
*.log
logs
# 銝湔𧒄<E6B994><F0A79284>
temp
tmp
*.swp
*.swo
*~
# <20>唳旿摨𤘪<E691A8>隞塚<E99A9E>SQLite嚗<65><E59A97><EFBFBD>𨀣<EFBFBD>嚗?
*.db
*.sqlite
# <20>𡁏𧋦<F0A1818F><F0A78BA6>辣嚗<E8BEA3><E59A97><EFBFBD><E69298>睲蝙<E79DB2><EFBFBD>
scripts/*.ts
*.bat
*.ps1
```
---
## <20><><EFBFBD>C嚗𡁶㮾<F0A181B6><EFBFBD>獢?
- [Node.js<6A>𡒊垢-SAE摰孵膥<E5ADB5>函蔡<E587BD><E894A1><EFBFBD>](./05-Node.js<6A>𡒊垢-SAE摰孵膥<E5ADB5>函蔡<E587BD><E894A1><EFBFBD>.md)
- [<EFBFBD>函蔡餈𥕦漲<EFBFBD><EFBFBD>](./00-<2D>函蔡餈𥕦漲<F0A595A6><EFBFBD>.md)
- [PostgreSQL<51>唳旿摨㯄<E691A8>蝵脫<E89DB5>雿𨀣<E99BBF><F0A880A3>䀉(./08-PostgreSQL<51>唳旿摨㯄<E691A8>蝵脫<E89DB5>雿𨀣<E99BBF><F0A880A3>?md)
- [Python敺格<EFBFBD><EFBFBD>?SAE<41>函蔡<E587BD><EFBFBD><E6BBA2><EFBFBD>](./09-Python敺格<E695BA><E6A0BC>?SAE<41>函蔡<E587BD><EFBFBD><E6BBA2><EFBFBD>.md)
---
**<EFBFBD><EFBFBD>﹝蝏湔擪<EFBFBD>?*: AI Assistant
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*: 2024-12-24
**<EFBFBD><EFBFBD>𧋦**: v1.0