11# 阶段1:基础镜像准备
2- FROM node:18 -alpine AS base
2+ FROM node:20 -alpine AS base
33
44# 设置工作目录
55WORKDIR /app
@@ -8,10 +8,11 @@ WORKDIR /app
88# RUN npm config set registry https://registry.npmmirror.com/
99
1010# 安装必要的系统依赖(例如 CA 证书)
11- RUN apk add --no-cache ca-certificates && update-ca-certificates
11+ RUN apk add --no-cache ca-certificates openssl && update-ca-certificates
1212
1313ENV NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca"
1414ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
15+ ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
1516
1617# 阶段2:构建应用程序
1718FROM base AS builder
@@ -20,28 +21,26 @@ WORKDIR /app
2021
2122# 复制依赖文件
2223COPY package.json yarn.lock ./
23- RUN yarn config set cafile /etc/ssl/certs/ca-certificates.crt
2424
2525# 配置镜像源
2626ARG REGISTRY_LIST="https://registry.npmmirror.com/ https://registry.npmjs.org/ https://registry.yarnpkg.com/"
2727ARG YARN_NETWORK_TIMEOUT="300000"
2828
29+
30+ RUN yarn config set cafile /etc/ssl/certs/ca-certificates.crt
31+
2932# 多镜像源回退安装:开发依赖 + 构建所需
30- RUN set -eux; \
31- success=0; \
33+ RUN --mount=type=cache,id=yarn-cache,target=/usr/local/share/.cache/yarn \
34+ set -eux; success=0; \
3235 for registry in $REGISTRY_LIST; do \
3336 echo "尝试 Yarn 镜像源: $registry" ; \
3437 yarn config set registry "$registry" ; \
3538 if yarn install --frozen-lockfile --network-timeout "$YARN_NETWORK_TIMEOUT" ; then \
36- echo "成功使用镜像源: $registry" ; \
37- success=1; \
38- break; \
39+ echo "成功使用镜像源: $registry" ; success=1; break; \
3940 else \
40- echo "镜像源 $registry 失败,清缓存并尝试下一个..." ; \
41- yarn cache clean || true; \
41+ echo "镜像源 $registry 失败,清缓存并尝试下一个..." ; yarn cache clean || true; \
4242 fi; \
43- done; \
44- if [ "$success" -ne 1 ]; then echo "所有镜像源尝试失败" ; exit 1; fi
43+ done; test "$success" -eq 1
4544
4645# # 安装所有依赖,包括开发依赖
4746# RUN yarn install
@@ -60,27 +59,23 @@ ENV NODE_ENV=production
6059
6160# 安装生产依赖
6261# RUN yarn install --production --ignore-scripts --prefer-offline
63- RUN set -eux; \
64- success=0; \
62+ RUN --mount=type=cache,id=yarn-cache,target=/usr/local/share/.cache/yarn \
63+ set -eux; success=0; \
6564 for registry in $REGISTRY_LIST; do \
6665 echo "尝试 Yarn 镜像源(生产依赖): $registry" ; \
6766 yarn config set registry "$registry" ; \
6867 if yarn install --frozen-lockfile --production --ignore-scripts --network-timeout "$YARN_NETWORK_TIMEOUT" ; then \
69- echo "成功使用镜像源(生产依赖): $registry" ; \
70- success=1; \
71- break; \
68+ echo "成功使用镜像源(生产依赖): $registry" ; success=1; break; \
7269 else \
73- echo "镜像源 $registry 失败,清缓存并尝试下一个..." ; \
74- yarn cache clean || true; \
70+ echo "镜像源 $registry 失败,清缓存并尝试下一个..." ; yarn cache clean || true; \
7571 fi; \
76- done; \
77- if [ "$success" -ne 1 ]; then echo "所有镜像源尝试失败" ; exit 1; fi
72+ done; test "$success" -eq 1
7873
7974# 清理 yarn 缓存
8075RUN yarn cache clean --all || true
8176
8277# 阶段3:构建最终的生产镜像
83- FROM node:18 -alpine
78+ FROM node:20 -alpine
8479
8580# 设置工作目录
8681WORKDIR /app
@@ -107,6 +102,8 @@ ENV NODE_ENV=production
107102ENV HOSTNAME="0.0.0.0"
108103ENV PORT=13000
109104ENV NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca"
105+ ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
106+ ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
110107
111108# 暴露端口
112109EXPOSE 13000
0 commit comments