-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathDockerfile
More file actions
150 lines (130 loc) · 5.35 KB
/
Copy pathDockerfile
File metadata and controls
150 lines (130 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# -----------------------------------------
# Base image
# -----------------------------------------
FROM node:20-alpine AS base
# -----------------------------------------
# Install dependencies
# -----------------------------------------
FROM base AS deps
RUN apk add --no-cache libc6-compat git-lfs
WORKDIR /app
COPY package*.json ./
COPY yarn.lock* ./
COPY pnpm-lock.yaml* ./
# Always perform a clean install
RUN if [ -f yarn.lock ]; then yarn --frozen-lockfile --cache-folder /tmp/yarn-cache; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm install --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci --force --cache /tmp/npm-cache; \
else npm install --force --cache /tmp/npm-cache; fi
# -----------------------------------------
# Build stage
# -----------------------------------------
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN git lfs pull || true
# Build info arguments
ARG BUILD_TIMESTAMP
ARG VERSION_DEPLOYED
ARG DEPLOYMENT_URL
ARG BUILD_DATE
ARG COMMIT_HASH
# Public and secret build arguments
ARG TINA_TOKEN
ARG TINA_SEARCH_TOKEN
ARG TINA_WEBHOOK_SECRET
ARG NEXT_PUBLIC_TINA_CLIENT_ID
ARG NEXT_PUBLIC_TINA_BRANCH
ARG NEXT_PUBLIC_ALGOLIA_APP_ID
ARG NEXT_PUBLIC_ALGOLIA_ADMIN_KEY
ARG NEXT_PUBLIC_ALGOLIA_INDEX_NAME
ARG NEXT_PUBLIC_ALGOLIA_API_KEY
ARG NEXT_PUBLIC_API_BASE_URL
ARG NEXT_PUBLIC_GITHUB_ORG
ARG NEXT_PUBLIC_GITHUB_REPO
ARG NEXT_PUBLIC_GISCUS_REPO_NAME
ARG NEXT_PUBLIC_GISCUS_REPO_ID
ARG NEXT_PUBLIC_GISCUS_CATEGORY_ID
ARG NEXT_PUBLIC_GISCUS_THEME_URL
ARG NEXT_PUBLIC_BASE_PATH
ARG NEXT_PUBLIC_GTM_CONTAINER_ID
ARG NEXT_PUBLIC_APPLICATIONINSIGHTS_CONNECTION_STRING
ARG GH_APP_ID
ARG GH_APP_PRIVATE_KEY
ARG GITHUB_APP_INSTALLATION_ID
# Build info environment variables (kept as before)
ENV BUILD_TIMESTAMP=$BUILD_TIMESTAMP \
VERSION_DEPLOYED=$VERSION_DEPLOYED \
DEPLOYMENT_URL=$DEPLOYMENT_URL \
BUILD_DATE=$BUILD_DATE \
COMMIT_HASH=$COMMIT_HASH \
TINA_TOKEN=$TINA_TOKEN \
TINA_SEARCH_TOKEN=$TINA_SEARCH_TOKEN \
TINA_WEBHOOK_SECRET=$TINA_WEBHOOK_SECRET \
NEXT_PUBLIC_TINA_CLIENT_ID=$NEXT_PUBLIC_TINA_CLIENT_ID \
NEXT_PUBLIC_TINA_BRANCH=$NEXT_PUBLIC_TINA_BRANCH \
NEXT_PUBLIC_ALGOLIA_APP_ID=$NEXT_PUBLIC_ALGOLIA_APP_ID \
NEXT_PUBLIC_ALGOLIA_ADMIN_KEY=$NEXT_PUBLIC_ALGOLIA_ADMIN_KEY \
NEXT_PUBLIC_ALGOLIA_INDEX_NAME=$NEXT_PUBLIC_ALGOLIA_INDEX_NAME \
NEXT_PUBLIC_ALGOLIA_API_KEY=$NEXT_PUBLIC_ALGOLIA_API_KEY \
NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL \
NEXT_PUBLIC_GITHUB_ORG=$NEXT_PUBLIC_GITHUB_ORG \
NEXT_PUBLIC_GITHUB_REPO=$NEXT_PUBLIC_GITHUB_REPO \
NEXT_PUBLIC_GISCUS_REPO_NAME=$NEXT_PUBLIC_GISCUS_REPO_NAME \
NEXT_PUBLIC_GISCUS_REPO_ID=$NEXT_PUBLIC_GISCUS_REPO_ID \
NEXT_PUBLIC_GISCUS_CATEGORY_ID=$NEXT_PUBLIC_GISCUS_CATEGORY_ID \
NEXT_PUBLIC_GISCUS_THEME_URL=$NEXT_PUBLIC_GISCUS_THEME_URL \
NEXT_PUBLIC_BASE_PATH=$NEXT_PUBLIC_BASE_PATH \
NEXT_PUBLIC_GTM_CONTAINER_ID=$NEXT_PUBLIC_GTM_CONTAINER_ID \
NEXT_PUBLIC_APPLICATIONINSIGHTS_CONNECTION_STRING=$NEXT_PUBLIC_APPLICATIONINSIGHTS_CONNECTION_STRING \
GH_APP_ID=$GH_APP_ID \
GH_APP_PRIVATE_KEY=$GH_APP_PRIVATE_KEY \
GITHUB_APP_INSTALLATION_ID=$GITHUB_APP_INSTALLATION_ID \
NEXT_TELEMETRY_DISABLED=1
# Build the Next.js application
RUN if [ -f yarn.lock ]; then yarn build; \
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
else npm run build; fi
# -----------------------------------------
# Reduce Next.js output size
# -----------------------------------------
RUN rm -rf .next/cache && \
find .next -type f -name "*.map" -delete && \
find .next -type f -name "*.nft.json" -size +5M -delete || true
# -----------------------------------------
# Size verification (debugging disk exhaustion)
# -----------------------------------------
RUN echo "----- Next.js build size overview -----" && \
du -sh .next || true && \
du -sh .next/standalone || true && \
du -sh .next/static || true && \
echo "----------------------------------------"
# -----------------------------------------
# Runner stage
# -----------------------------------------
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000 \
HOSTNAME="0.0.0.0"
# Build info for runtime
ARG BUILD_TIMESTAMP
ARG VERSION_DEPLOYED
ARG DEPLOYMENT_URL
ARG BUILD_DATE
ARG COMMIT_HASH
ENV BUILD_TIMESTAMP=$BUILD_TIMESTAMP \
VERSION_DEPLOYED=$VERSION_DEPLOYED \
DEPLOYMENT_URL=$DEPLOYMENT_URL \
BUILD_DATE=$BUILD_DATE \
COMMIT_HASH=$COMMIT_HASH
RUN addgroup -S nodejs -g 1001 && adduser -S nextjs -u 1001
USER nextjs
# Copy runtime files only
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]