From d61e39b6d817522b7235f20e4b18edc774cfcc46 Mon Sep 17 00:00:00 2001 From: polimyl <38382708+polimyl@users.noreply.github.com> Date: Sat, 13 Nov 2021 18:29:22 +0100 Subject: [PATCH] Docker image size optimization (#910) * build(docker): use slim base images * build(docker): create new stages that only include necessary files * build(docker): delete devDependencies after build * build(docker): move env vars to a later point for better caching --- docker/backend/Dockerfile | 37 +++++++++++++++++++++++++++++------ docker/discord-bot/Dockerfile | 33 +++++++++++++++++++++++++------ docker/frontend/Dockerfile | 36 +++++++++++++++++++++++++++++----- 3 files changed, 89 insertions(+), 17 deletions(-) diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile index 810e8809..3f3e92c5 100644 --- a/docker/backend/Dockerfile +++ b/docker/backend/Dockerfile @@ -1,11 +1,8 @@ -FROM node:14 as base +FROM node:14-slim as base WORKDIR /usr/src/app -ARG GRAPHQL_HOST -ARG GRAPHQL_DOMAIN=onrender.com - -ENV GRAPHQL_URL https://$GRAPHQL_HOST.$GRAPHQL_DOMAIN/v1/graphql -ENV HASURA_GRAPHQL_ADMIN_SECRET metagame_secret +# Install dependencies not included in the slim image +RUN apt-get update && apt-get install -y --no-install-recommends g++ make python # Install dependencies for dev and prod COPY package.json . @@ -28,7 +25,35 @@ COPY packages/utils ./packages/utils/ COPY packages/discord-bot ./packages/discord-bot/ COPY packages/@types ./packages/@types/ +# Set env vars +ARG GRAPHQL_HOST +ARG GRAPHQL_DOMAIN=onrender.com + +ENV GRAPHQL_URL https://$GRAPHQL_HOST.$GRAPHQL_DOMAIN/v1/graphql +ENV HASURA_GRAPHQL_ADMIN_SECRET metagame_secret + # Build RUN yarn backend:build +# Delete devDependencies +RUN yarn install --pure-lockfile --production --ignore-scripts --prefer-offline + +# Create completely new stage including only necessary files +FROM node:14-alpine as app +WORKDIR /app + +# Copy necessary files into the stage +COPY --from=build /usr/src/app/package.json ./package.json +COPY --from=build /usr/src/app/node_modules ./node_modules + +COPY --from=build /usr/src/app/packages/backend/package.json ./packages/backend/package.json +COPY --from=build /usr/src/app/packages/backend/dist ./packages/backend/dist + +COPY --from=build /usr/src/app/packages/utils/package.json ./packages/utils/package.json +COPY --from=build /usr/src/app/packages/utils/dist ./packages/utils/dist +COPY --from=build /usr/src/app/packages/utils/node_modules ./packages/utils/node_modules + +COPY --from=build /usr/src/app/packages/discord-bot/package.json ./packages/discord-bot/package.json +COPY --from=build /usr/src/app/packages/discord-bot/dist ./packages/discord-bot/dist + CMD [ "yarn", "backend", "start" ] diff --git a/docker/discord-bot/Dockerfile b/docker/discord-bot/Dockerfile index dcdc7667..711facba 100644 --- a/docker/discord-bot/Dockerfile +++ b/docker/discord-bot/Dockerfile @@ -1,10 +1,8 @@ -FROM node:12 as base +FROM node:12-slim as base WORKDIR /usr/src/app -ARG GRAPHQL_HOST - -ENV GRAPHQL_URL https://$GRAPHQL_HOST.onrender.com/v1/graphql -ENV HASURA_GRAPHQL_ADMIN_SECRET metagame_secret +# Install dependencies not included in the slim image +RUN apt-get update && apt-get install -y --no-install-recommends g++ make python # Install dependencies for dev and prod COPY package.json . @@ -25,9 +23,32 @@ COPY packages/discord-bot ./packages/discord-bot/ COPY packages/utils ./packages/utils/ COPY packages/@types ./packages/@types/ +# Set env vars +ARG GRAPHQL_HOST + +ENV GRAPHQL_URL https://$GRAPHQL_HOST.onrender.com/v1/graphql +ENV HASURA_GRAPHQL_ADMIN_SECRET metagame_secret +ENV RUNTIME_ENV docker + # Build RUN yarn discord-bot build -ENV RUNTIME_ENV=docker +# Delete devDependencies +RUN yarn install --pure-lockfile --production --ignore-scripts --prefer-offline + +# Create completely new stage including only necessary files +FROM node:12-alpine as app +WORKDIR /app + +# Copy necessary files into the stage +COPY --from=build /usr/src/app/package.json ./package.json +COPY --from=build /usr/src/app/node_modules ./node_modules + +COPY --from=build /usr/src/app/packages/discord-bot/package.json ./packages/discord-bot/package.json +COPY --from=build /usr/src/app/packages/discord-bot/dist ./packages/discord-bot/dist + +COPY --from=build /usr/src/app/packages/utils/package.json ./packages/utils/package.json +COPY --from=build /usr/src/app/packages/utils/dist ./packages/utils/dist +COPY --from=build /usr/src/app/packages/utils/node_modules ./packages/utils/node_modules CMD [ "yarn", "discord-bot", "start" ] diff --git a/docker/frontend/Dockerfile b/docker/frontend/Dockerfile index 1d1655c8..694e4cbc 100644 --- a/docker/frontend/Dockerfile +++ b/docker/frontend/Dockerfile @@ -1,10 +1,8 @@ -FROM node:14 as base +FROM node:14-slim as base WORKDIR /usr/src/app -ARG GRAPHQL_HOST -ARG GRAPHQL_DOMAIN=onrender.com - -ENV NEXT_PUBLIC_GRAPHQL_URL https://$GRAPHQL_HOST.$GRAPHQL_DOMAIN/v1/graphql +# Install dependencies not included in the slim image +RUN apt-get update && apt-get install -y --no-install-recommends g++ make python git ca-certificates # Install dependencies for dev and prod COPY package.json . @@ -31,7 +29,35 @@ COPY packages/utils ./packages/utils/ COPY packages/design-system ./packages/design-system/ COPY packages/@types ./packages/@types/ +# Set env vars +ARG GRAPHQL_HOST +ARG GRAPHQL_DOMAIN=onrender.com + +ENV NEXT_PUBLIC_GRAPHQL_URL https://$GRAPHQL_HOST.$GRAPHQL_DOMAIN/v1/graphql + # Build RUN yarn web:build +# Delete devDependencies +RUN yarn install --pure-lockfile --production --ignore-scripts --prefer-offline + +# Create completely new stage including only necessary files +FROM node:14-alpine as app +WORKDIR /app + +# Copy necessary files into the stage +COPY --from=build /usr/src/app/package.json ./package.json +COPY --from=build /usr/src/app/node_modules ./node_modules + +COPY --from=build /usr/src/app/packages/web/package.json ./packages/web/package.json +COPY --from=build /usr/src/app/packages/web/public ./packages/web/public +COPY --from=build /usr/src/app/packages/web/.next ./packages/web/.next + +COPY --from=build /usr/src/app/packages/utils/package.json ./packages/utils/package.json +COPY --from=build /usr/src/app/packages/utils/dist ./packages/utils/dist +COPY --from=build /usr/src/app/packages/utils/node_modules ./packages/utils/node_modules + +COPY --from=build /usr/src/app/packages/design-system/package.json ./packages/design-system/package.json +COPY --from=build /usr/src/app/packages/design-system/dist ./packages/design-system/dist + CMD [ "yarn", "web", "start" ]