11# Stage 1: Build stage
2- FROM node:20-slim AS builder
2+ FROM node:20-alpine AS builder
33
44LABEL maintainer="https://github.com/its4nik"
55LABEL version="2.0.1"
@@ -15,45 +15,61 @@ WORKDIR /app
1515
1616ENV NODE_NO_WARNINGS=1
1717
18+ RUN apk add --no-cache curl bash
19+
1820COPY package*.json tsconfig.json environment.d.ts ./
1921
20- RUN npm install --production=false
22+ RUN npm ci --include=dev
2123
2224COPY ./src ./src
2325RUN mv ./src/sample-variable.json ./src/data/variables.json
24- RUN npm run build:mini
2526
26- # Stage 2: Production stage
27- FROM node:20-alpine AS production
27+ RUN npm run build:mini
2828
29+ # --------------------------------------
30+ # Stage 2: Dependency pruning stage
31+ FROM node:20-alpine AS deps
2932WORKDIR /api
33+ COPY --from=builder /app/package*.json .
34+ RUN npm ci --omit=dev
3035
31- RUN apk add --no-cache docker docker-compose bash curl && \
32- adduser -h /api -s /bin/sh -D dockstatapi && \
33- addgroup -S docker && \
34- addgroup dockstatapi docker
36+ # --------------------------------------
37+ # Stage 3: Final production image
38+ FROM node:20-alpine AS prod
3539
36- HEALTHCHECK --interval=5m --timeout=3s \
37- CMD curl -f http://localhost:9876/api/status || exit 1
40+ WORKDIR /api
3841
39- COPY --chown=dockstatapi:dockstatapi --from=builder /app/dist/src /api/src
40- COPY --chown=dockstatapi:dockstatapi --from=builder /app/package*.json /api/
41- COPY --chown=dockstatapi:dockstatapi --from=builder /app/src/config/swagger.yaml /api/src/config/swagger.yaml
42- COPY --chown=dockstatapi:dockstatapi --from=builder /app/src/utils/assets /api/src/utils/assets
42+ RUN apk add --no-cache docker-cli bash curl && \
43+ mkdir -p /usr/libexec/docker/cli-plugins && \
44+ curl -sSL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m)" \
45+ -o /usr/libexec/docker/cli-plugins/docker-compose && \
46+ chmod +x /usr/libexec/docker/cli-plugins/docker-compose && \
47+ rm -rf /var/cache/apk/*
4348
44- RUN npm install --omit=dev && \
45- rm -rf package-lock.json node_modules/.cache
49+ ARG USER_ID=10001
50+ ARG GROUP_ID=10001
51+ RUN addgroup -g $GROUP_ID dockstatapi && \
52+ adduser -u $USER_ID -G dockstatapi -h /api -s /bin/sh -D dockstatapi
4653
47- COPY --chown=dockstatapi:dockstatapi --from=builder /app/src/misc/entrypoint.sh /api/entrypoint.sh
48- COPY --chown=dockstatapi:dockstatapi --from=builder /app/src/misc/createEnvFile.sh /api/createEnvFile.sh
49- RUN chmod +x /api/*.sh
54+ COPY --from=builder --chown=dockstatapi:dockstatapi /app/dist/src ./src
55+ COPY --from=builder --chown=dockstatapi:dockstatapi /app/src/config/swagger.yaml ./src/config/swagger.yaml
56+ COPY --from=builder --chown=dockstatapi:dockstatapi /app/src/utils/assets ./src/utils/assets
57+ COPY --from=deps --chown=dockstatapi:dockstatapi /api/node_modules ./node_modules
5058
51- EXPOSE 9876
59+ COPY --from=builder --chown=dockstatapi:dockstatapi /app/src/misc/entrypoint.sh .
60+ COPY --from=builder --chown=dockstatapi:dockstatapi /app/src/misc/createEnvFile.sh .
61+ RUN chmod +x *.sh
5262
5363RUN mkdir -p /api/src/data && \
54- chmod -R 777 /api/src/data /api && \
55- chown -R dockstatapi:dockstatapi /api
64+ chown -R dockstatapi:dockstatapi /api && \
65+ chmod -R 755 /api && \
66+ chmod 775 /api/src/data
67+
68+ HEALTHCHECK --interval=5m --timeout=3s \
69+ CMD curl -f http://localhost:9876/api/status || exit 1
5670
71+ EXPOSE 9876
5772STOPSIGNAL 130
5873USER dockstatapi
74+
5975ENTRYPOINT [ "sh", "./entrypoint.sh", "--prod" ]
0 commit comments