From 86d7802cb2ec9bbc5883a42b1d332fff79218a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6berl?= Date: Fri, 10 May 2024 10:37:54 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=8B=20ci:=20create=20smaller=20Docker?= =?UTF-8?q?=20images?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - create fewer layers - install only prod dependencies for final build - clean npm cache - fix layering in multi-image build --- Dockerfile | 30 ++++++++++++++---------------- Dockerfile.multi | 17 ++++++++--------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index f688efa7e927..6c70a6d7f24b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,8 @@ # v0.7.2 # Base node image -FROM node:18-alpine3.18 AS node +FROM node:20-alpine AS node -RUN apk add g++ make py3-pip -RUN npm install -g node-gyp RUN apk --no-cache add curl RUN mkdir -p /app && chown node:node /app @@ -14,20 +12,20 @@ USER node COPY --chown=node:node . . -# Allow mounting of these files, which have no default -# values. -RUN touch .env -RUN npm config set fetch-retry-maxtimeout 600000 -RUN npm config set fetch-retries 5 -RUN npm config set fetch-retry-mintimeout 15000 -RUN npm install --no-audit +RUN \ + # Allow mounting of these files, which have no default + touch .env ; \ + # Create directories for the volumes to inherit the correct permissions + mkdir -p /app/client/public/images /app/api/logs ; \ + npm config set fetch-retry-maxtimeout 600000 ; \ + npm config set fetch-retries 5 ; \ + npm config set fetch-retry-mintimeout 15000 ; \ + npm install --no-audit; \ + # React client build + NODE_OPTIONS="--max-old-space-size=2048" npm run frontend; \ + npm prune --production; \ + npm cache clean --force -# React client build -ENV NODE_OPTIONS="--max-old-space-size=2048" -RUN npm run frontend - -# Create directories for the volumes to inherit -# the correct permissions RUN mkdir -p /app/client/public/images /app/api/logs # Node API setup diff --git a/Dockerfile.multi b/Dockerfile.multi index a3bc0fed4030..41e8825b8108 100644 --- a/Dockerfile.multi +++ b/Dockerfile.multi @@ -7,32 +7,31 @@ FROM node:20-alpine AS base FROM base AS data-provider-build WORKDIR /app/packages/data-provider COPY ./packages/data-provider ./ -RUN npm install +RUN npm install; npm cache clean --force RUN npm run build +RUN npm prune --production # React client build -FROM data-provider-build AS client-build +FROM base AS client-build WORKDIR /app/client COPY ./client/package*.json ./ # Copy data-provider to client's node_modules -RUN mkdir -p /app/client/node_modules/librechat-data-provider/ -RUN cp -R /app/packages/data-provider/* /app/client/node_modules/librechat-data-provider/ -RUN npm install +COPY --from=data-provider-build /app/packages/data-provider/ /app/client/node_modules/librechat-data-provider/ +RUN npm install; npm cache clean --force COPY ./client/ ./ ENV NODE_OPTIONS="--max-old-space-size=2048" RUN npm run build # Node API setup -FROM data-provider-build AS api-build +FROM base AS api-build WORKDIR /app/api COPY api/package*.json ./ COPY api/ ./ # Copy helper scripts COPY config/ ./ # Copy data-provider to API's node_modules -RUN mkdir -p /app/api/node_modules/librechat-data-provider/ -RUN cp -R /app/packages/data-provider/* /app/api/node_modules/librechat-data-provider/ -RUN npm install +COPY --from=data-provider-build /app/packages/data-provider/ /app/api/node_modules/librechat-data-provider/ +RUN npm install --include prod; npm cache clean --force COPY --from=client-build /app/client/dist /app/client/dist EXPOSE 3080 ENV HOST=0.0.0.0