Skip to content

Commit 6ae0375

Browse files
committed
build(docker): Update to refactor Dockerfile for multi-stage build and add nginx configuration
1 parent 88c9eca commit 6ae0375

File tree

3 files changed

+88
-21
lines changed

3 files changed

+88
-21
lines changed

Dockerfile

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
1-
FROM node:20-alpine AS dependencies-env
1+
# 建置階段
2+
FROM node:20-alpine AS build
23
RUN npm i -g pnpm
3-
COPY . /app
4-
5-
FROM dependencies-env AS development-dependencies-env
6-
COPY ./package.json pnpm-lock.yaml /app/
74
WORKDIR /app
5+
COPY package.json pnpm-lock.yaml ./
86
RUN pnpm i --frozen-lockfile
9-
10-
FROM dependencies-env AS production-dependencies-env
11-
COPY ./package.json pnpm-lock.yaml /app/
12-
WORKDIR /app
13-
RUN pnpm i --prod --frozen-lockfile
14-
15-
FROM dependencies-env AS build-env
16-
COPY ./package.json pnpm-lock.yaml /app/
17-
COPY --from=development-dependencies-env /app/node_modules /app/node_modules
18-
WORKDIR /app
7+
COPY . .
8+
# 設定建置時的環境變數
9+
ARG VITE_APP_API_URL
10+
ARG VITE_APP_API_PATH
11+
ENV VITE_APP_API_URL=${VITE_APP_API_URL}
12+
ENV VITE_APP_API_PATH=${VITE_APP_API_PATH}
1913
RUN pnpm build
2014

21-
FROM dependencies-env
22-
COPY ./package.json pnpm-lock.yaml /app/
23-
COPY --from=production-dependencies-env /app/node_modules /app/node_modules
24-
COPY --from=build-env /app/build /app/build
25-
WORKDIR /app
26-
CMD ["pnpm", "start"]
15+
# 運行階段
16+
FROM nginx:alpine
17+
# 複製檔案
18+
COPY --from=build /app/build/client /usr/share/nginx/html/
19+
# 複製 nginx 配置模板
20+
COPY nginx.conf /etc/nginx/templates/default.conf.template
21+
# 設定運行時的環境變數
22+
ENV VITE_APP_API_URL=${VITE_APP_API_URL}
23+
ENV VITE_APP_API_PATH=${VITE_APP_API_PATH}
24+
# 使用 envsubst 來替換環境變數
25+
CMD ["/bin/sh", "-c", "envsubst '${VITE_APP_API_URL} ${VITE_APP_API_PATH}' < /etc/nginx/templates/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]

Dockerfile.pnpm

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
FROM node:20-alpine AS dependencies-env
2+
RUN npm i -g pnpm
3+
COPY . /app
4+
FROM dependencies-env AS development-dependencies-env
5+
COPY ./package.json pnpm-lock.yaml /app/
6+
WORKDIR /app
7+
RUN pnpm i --frozen-lockfile
8+
FROM dependencies-env AS production-dependencies-env
9+
COPY ./package.json pnpm-lock.yaml /app/
10+
WORKDIR /app
11+
RUN pnpm i --prod --frozen-lockfile
12+
FROM dependencies-env AS build-env
13+
COPY ./package.json pnpm-lock.yaml /app/
14+
COPY --from=development-dependencies-env /app/node_modules /app/node_modules
15+
WORKDIR /app
16+
RUN pnpm build
17+
18+
FROM dependencies-env
19+
COPY ./package.json pnpm-lock.yaml /app/
20+
COPY --from=production-dependencies-env /app/node_modules /app/node_modules
21+
COPY --from=build-env /app/build /app/build
22+
WORKDIR /app
23+
CMD ["pnpm", "start"]

nginx.conf

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
server {
2+
listen 8080;
3+
include /etc/nginx/mime.types;
4+
5+
root /usr/share/nginx/html;
6+
index index.html;
7+
8+
# API Proxy 設定
9+
location /v2/ {
10+
proxy_pass ${VITE_APP_API_URL};
11+
12+
# SSL 設定
13+
proxy_ssl_server_name on;
14+
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
15+
16+
# 基本代理設定
17+
proxy_http_version 1.1;
18+
proxy_set_header Host $proxy_host;
19+
proxy_set_header X-Real-IP $remote_addr;
20+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
21+
proxy_set_header X-Forwarded-Proto $scheme;
22+
23+
# API 路徑重寫
24+
rewrite ^/v2/api/${VITE_APP_API_PATH}/(.*) /api/${VITE_APP_API_PATH}/$1 break;
25+
}
26+
27+
# 其他路由設定保持不變
28+
location /react-main-2024-w2 {
29+
alias /usr/share/nginx/html;
30+
try_files $uri $uri/ /index.html;
31+
32+
location ~ \.js$ {
33+
add_header Content-Type "application/javascript";
34+
}
35+
}
36+
37+
location /react-main-2024-w2/assets/ {
38+
alias /usr/share/nginx/html/assets/;
39+
add_header Cache-Control "public, max-age=31536000, immutable";
40+
}
41+
42+
location = / {
43+
return 301 /react-main-2024-w2/;
44+
}
45+
}

0 commit comments

Comments
 (0)