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

13 KiB
Raw Blame History

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>滚𦛚
**<2A><EFBFBD>霂餉<E99C82>?*: 餈鞟輕撌亦<E6928C><EFBFBD><E692A3><EFBFBD><EFBFBD>蝡臬<E89DA1><E887AC>穃極蝔见<E89D94>


<EFBFBD><EFBFBD> <20><EFBFBD>

  1. <EFBFBD><EFBFBD>遣璁<EFBFBD>
  2. <EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>
  3. <EFBFBD><EFBFBD>遣瘚<EFBFBD><EFBFBD>
  4. <EFBFBD>𨅯<EFBFBD>靽⊥<EFBFBD>
  5. <EFBFBD><EFBFBD><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>隡睃飵嚗?

撖寞<EFBFBD>憿? 隡删<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>䲮獢㇂
TypeScript蝻𤥁<EFBFBD> Docker銝剜<EFBFBD>銵? <EFBFBD>砍𧑐憸<EFBFBD><EFBFBD>霂?<3F>?
靘肽<EFBFBD>摰㕑<EFBFBD> 摰峕㟲靘肽<EFBFBD> <EFBFBD><EFBFBD>鈭找<EFBFBD>韏?<3F>?
蝵𤑳<EFBFBD>靘肽<EFBFBD> 擃矋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 雿𠬍<EFBFBD><EFBFBD>渡迅摰𡄯<EFBFBD> <20>?
<EFBFBD><EFBFBD><EFBFBD>園𡢿 ~10<31><30><EFBFBD> ~5<><35><EFBFBD> <20>?
*撟喳蝱<EFBFBD>澆捆<EFBFBD>? <EFBFBD><EFBFBD><EFBFBD>? <EFBFBD>𣳇<EFBFBD><EFBFBD>?<3F>?

1.2 <20><><EFBFBD><EFBFBD>

<EFBFBD>𨅯<EFBFBD><EFBFBD>滨妍: backend-service:v1.0
<0A>𨅯<EFBFBD>憭批<E686AD>: 838MB (<28>讠憬<E8AEA0>?~186MB)
<0A>𨅯<EFBFBD>ID: a4ffb61c15af
<0A><><EFBFBD>園𡢿: ~5<><35><EFBFBD>
ACR<43><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>?

# 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>

<EFBFBD>?敹<>◆摰峕<E691B0><E5B395><EFBFBD>郊撉?

甇仿炊1嚗䥪risma<EFBFBD><EFBFBD><EFBFBD>峕郊嚗<EFBFBD><EFBFBD>憿鳴<EFBFBD>

# 霈曄蔭銝湔𧒄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嚗𡁶<EFBFBD><EFBFBD>辥risma Client

npx prisma generate

# 颲枏枂摨磰砲<E7A3B0>曄內嚗?
# <20>?Generated Prisma Client (v6.17.0)

甇仿炊3嚗関ypeScript蝻𤥁<EFBFBD><EFBFBD><EFBFBD>憿鳴<EFBFBD>

# 蝻𤥁<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>鞟內嚗𡁜<EFBFBD><EFBFBD>𦦵<EFBFBD>霂穃仃韐伐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>耨憭齿<EFBFBD><EFBFBD>凤ypeScript<EFBFBD>躰秤嚗?


3. <20><>遣瘚<E981A3><E7989A>

3.1 摰峕㟲<E5B395><E39FB2>遣甇仿炊

# 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>嚗?

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>

COPY dist ./dist  # 憭滚<E686AD><E6BB9A>砍𧑐撌脩<E6928C>霂𤑳<E99C82>TypeScript隞<74><E99A9E>

*<EFBFBD>嗆挾3嚗朞<EFBFBD>銵屸<EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗?

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

# 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<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𠄎AE<EFBFBD>函蔡雿輻鍂嚗㚁<EFBFBD>

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>

<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/
<0A><EFBFBD><E98EBF><EFBFBD> node_modules/          # <20>煺漣靘肽<E99D98>
<0A><EFBFBD><E98EBF><EFBFBD> dist/                  # 蝻𤥁<E89DBB><F0A4A581>𡒊<EFBFBD>JS隞<53><E99A9E>
<0A><EFBFBD><E98EBF><EFBFBD> prisma/                # Prisma Schema
<0A>?  <20><EFBFBD><E5A999><EFBFBD> schema.prisma
<0A><EFBFBD><E98EBF><EFBFBD> package.json
<0A><EFBFBD><E5A999><EFBFBD> uploads/               # 銝湔𧒄<E6B994><F0A79284><EFBFBD><EFBFBD>

4.4 <20>臬𢆡<E887AC>賭誘

CMD ["node", "dist/index.js"]

4.5 <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); })"

5. <20><><EFBFBD><EFBFBD>埝䰻

5.1 撣貉<E692A3><E8B289><EFBFBD>

<EFBFBD>?<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<EFBFBD><EFBFBD><EFBFBD>峕郊<EFBFBD>𡒊撩撠穃<EFBFBD>蝟餃<EFBFBD>畾?
  • <EFBFBD><EFBFBD>銝窰risma<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

# 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>滨蔭

<EFBFBD>?<3F><EFBFBD>2嚗鋽ocker<65><72>遣蝵𤑳<E89DB5><EFBFBD>𧒄

*<EFBFBD><EFBFBD>𠶖嚗?

npm error code ECONNRESET
npm error network aborted

*<EFBFBD><EFBFBD>嚗?

  • npm<EFBFBD>𨅯<EFBFBD>皞鞟<EFBFBD>蝏靝<EFBFBD>蝔喳<EFBFBD>
  • npm ci 銝贝蝸靘肽<E99D98>憭梯揖

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <0A>?*雿輻鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䲮獢㇂嚗<EFBFBD>𧋦甈⊿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

  • <EFBFBD>砍𧑐憸<EFBFBD><EFBFBD>霂𡢅<EFBFBD>頝唾<EFBFBD>Docker銝剔<EFBFBD>蝻𤥁<EFBFBD>甇仿炊
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭找<EFBFBD>韏吔<EFBFBD><EFBFBD><EFBFBD>蝵𤑳<EFBFBD>隡㰘<EFBFBD>

<EFBFBD>?<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>嚗?

  • 雿輻鍂鈭<EFBFBD><EFBFBD>霂舐<EFBFBD>ACR<EFBFBD><EFBFBD>
  • 摨磰砲雿輻鍂銝芯犖<EFBFBD><EFBFBD><EFBFBD>靘见𧑐<EFBFBD><EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD>銝𡁶<EFBFBD><EFBFBD><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

# <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

<EFBFBD>?<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<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>券燵<EFBFBD><EFBFBD>VPC<EFBFBD><EFBFBD><EFBFBD>?
  • <EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>𤑳㴓憓<EFBFBD><EFBFBD>瘜閗挪<EFBFBD>姬PC<EFBFBD><EFBFBD><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

# <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>

# 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>?

  • 撌脣<EFBFBD><EFBFBD>辥risma<EFBFBD><EFBFBD><EFBFBD>峕郊嚗Ǒnpx prisma db pull`嚗?
  • 撌脩<EFBFBD><EFBFBD>辥risma Client嚗Ǒnpx prisma generate`嚗?
  • TypeScript蝻𤥁<EFBFBD><EFBFBD>𣂼<EFBFBD>嚗Ǒnpm run build`嚗?
  • dist<EFBFBD><EFBFBD>撌脩<EFBFBD><EFBFBD>𣂷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂穃<EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><EFBFBD>
  • Docker Desktop撌脣鍳<E884A3>典僎餈鞱<E9A488>
  • 蝵𤑳<EFBFBD>餈墧𦻖甇<EFBFBD>

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>

# <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>

# <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>撱?

# <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. 銝滩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>譍葉<EFBFBD><EFBFBD><EFBFBD>𤩺<EFBFBD>靽⊥<EFBFBD>

    • <EFBFBD>?銝滩<E98A9D><E6BBA9>𢲩.env`<60><>辣憭滚<E686AD><E6BB9A><EFBFBD><E59C88>?
    • <EFBFBD>?雿輻鍂SAE<41><EFBFBD><E887AC><EFBFBD>瘜典<E7989C><E585B8>滨蔭
  2. 雿輻鍂<EFBFBD>𡇙oot<EFBFBD><EFBFBD>餈鞱<EFBFBD>

    RUN addgroup -g 1001 -S nodejs && \
        adduser -S nodejs -u 1001
    USER nodejs
    
  3. 摰𡁏<EFBFBD><EFBFBD>湔鰵<EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD>

    FROM node:alpine  # 雿輻鍂<E8BCBB><E98D82><EFBFBD><EFBFBD>Alpine<6E><65>𧋦
    

<EFBFBD><EFBFBD><EFBFBD>A嚗鋽ockerfile摰峕㟲<EFBFBD><EFBFBD>

# ==================== <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"]

<EFBFBD><EFBFBD><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

<EFBFBD><EFBFBD><EFBFBD>C嚗𡁶㮾<EFBFBD><EFBFBD>獢?


**<2A><>﹝蝏湔擪<E6B994>?: AI Assistant
**<2A><><EFBFBD>擧凒<E693A7>?
: 2024-12-24
<EFBFBD><EFBFBD>𧋦: v1.0