From 8f18cd14dd2149ebdc7e6db31644f71dba4235a1 Mon Sep 17 00:00:00 2001 From: Karmaa Date: Sun, 16 Mar 2025 19:30:41 -0500 Subject: [PATCH] Optimized Dockerfile to produce a smaller and faster build --- docker/Dockerfile | 63 ++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4637922b..ca944504 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,53 +1,60 @@ # Stage 1: Build frontend -FROM --platform=$BUILDPLATFORM node:18 AS frontend-builder +FROM --platform=$BUILDPLATFORM node:18-alpine AS frontend-builder WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci --only=production COPY . . RUN npm run build # Stage 2: Build backend -FROM --platform=$BUILDPLATFORM node:18 AS backend-builder +FROM --platform=$BUILDPLATFORM node:18-alpine AS backend-builder WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm ci --only=production COPY src/backend/ ./src/backend/ -# Stage 3: Final production image -FROM mongo:4.4 -# Install Node.js -RUN apt-get update && apt-get install -y \ - curl \ - nginx \ - python3 \ - build-essential \ - && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ - && apt-get install -y nodejs \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* +# Stage 3: Build bcrypt for the target platform +FROM --platform=$TARGETPLATFORM node:18-alpine AS bcrypt-builder +WORKDIR /app +COPY package*.json ./ +RUN apk add --no-cache python3 make g++ \ + && npm ci --only=production bcrypt \ + && rm -rf /root/.npm -# Configure nginx +# Stage 4: Final production image +FROM mongo:4.4-focal +# Install Node.js and nginx, cleanup in the same layer +RUN apt-get update && apt-get install -y --no-install-recommends \ + nginx \ + curl \ + && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y --no-install-recommends nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/cache/apt/* + +# Configure nginx and copy frontend COPY docker/nginx.conf /etc/nginx/nginx.conf COPY --from=frontend-builder /app/dist /usr/share/nginx/html -# Setup backend +# Setup backend with pre-built bcrypt WORKDIR /app COPY package*.json ./ -RUN npm install --omit=dev +RUN npm ci --only=production --ignore-scripts +COPY --from=bcrypt-builder /app/node_modules/bcrypt /app/node_modules/bcrypt COPY --from=backend-builder /app/src/backend ./src/backend -# Create directories for MongoDB and nginx -RUN mkdir -p /data/db && \ - mkdir -p /var/log/nginx && \ - mkdir -p /var/lib/nginx && \ - mkdir -p /var/log/mongodb && \ - chown -R mongodb:mongodb /data/db /var/log/mongodb && \ - chown -R www-data:www-data /var/log/nginx /var/lib/nginx +# Create necessary directories and set permissions +RUN mkdir -p /data/db /var/log/{nginx,mongodb} /var/lib/nginx \ + && chown -R mongodb:mongodb /data/db /var/log/mongodb \ + && chown -R www-data:www-data /var/log/nginx /var/lib/nginx \ + && rm -rf /root/.npm /tmp/* # Set environment variables ENV MONGO_URL=mongodb://localhost:27017/termix \ MONGODB_DATA_DIR=/data/db \ - MONGODB_LOG_DIR=/var/log/mongodb + MONGODB_LOG_DIR=/var/log/mongodb \ + NODE_ENV=production # Create volume for MongoDB data VOLUME ["/data/db"] @@ -55,7 +62,7 @@ VOLUME ["/data/db"] # Expose ports EXPOSE 8080 8081 8082 27017 -# Use a entrypoint script to run all services +# Copy and set entrypoint COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh CMD ["/entrypoint.sh"] \ No newline at end of file