| |
|
|
| ARG NODE_IMAGE=node:20-bookworm-slim |
|
|
| FROM ${NODE_IMAGE} AS deps |
| WORKDIR /app |
|
|
| COPY package.json package-lock.json ./ |
| COPY shared/package.json ./shared/ |
| COPY server/package.json ./server/ |
| COPY client/package.json ./client/ |
|
|
| RUN npm ci |
|
|
| FROM deps AS build |
| WORKDIR /app |
|
|
| COPY . . |
|
|
| RUN npm run build |
| RUN npm prune --omit=dev |
|
|
| FROM ${NODE_IMAGE} AS runtime |
| WORKDIR /app |
|
|
| ENV NODE_ENV=production |
| ENV PORT=7860 |
|
|
| COPY --from=build --chown=node:node /app/package.json /app/package-lock.json ./ |
| COPY --from=build --chown=node:node /app/node_modules ./node_modules |
| COPY --from=build --chown=node:node /app/shared ./shared |
| COPY --from=build --chown=node:node /app/server/package.json ./server/package.json |
| COPY --from=build --chown=node:node /app/server/dist ./server/dist |
| COPY --from=build --chown=node:node /app/client/dist ./client/dist |
| |
| USER node |
|
|
| EXPOSE 7860 |
|
|
| HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ |
| CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 7860) + '/api/ping').then((res) => { if (!res.ok) process.exit(1); }).catch(() => process.exit(1));" |
|
|
| CMD ["node", "server/dist/index.js"] |
|
|