FROM node:18-alpine # Build arguments for versioning ARG GIT_COMMIT=unknown ARG APP_VERSION=1.0.0 WORKDIR /app # Install curl for healthcheck and git for commit info RUN apk add --no-cache curl git # Copy package files first for layer caching COPY package*.json ./ RUN npm install --production # Copy app code (changes more often — below the cached layer) COPY . . # Try to get git commit if not provided and .git exists RUN if [ "$GIT_COMMIT" = "unknown" ] && [ -d .git ]; then \ GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ fi && \ echo "export GIT_COMMIT=${GIT_COMMIT}" >> /etc/profile.d/git-version.sh # Set environment variables for runtime ENV GIT_COMMIT=${GIT_COMMIT} \ APP_VERSION=${APP_VERSION} EXPOSE 3000 HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=2 \ CMD curl -f http://localhost:3000/health || exit 1 CMD ["node", "server.js"]