From 579d53a273e2253a5a51d507334eea8fb4a6fe97 Mon Sep 17 00:00:00 2001 From: "Lin, Hung-Shin" Date: Thu, 26 Oct 2023 14:10:00 +0800 Subject: [PATCH] feat: refactor dockerfiles * combine dev and prod into multi-stages dockerfile * replace node with node:20-alpine to reduce image size --- .github/workflows/ci_cd.yml | 3 +++ app/Dockerfile | 15 +++++++++++---- app/Dockerfile.dev | 11 ----------- docker-compose.prod.yml | 3 +++ docker-compose.testing.yml | 2 ++ docker-compose.yml | 9 ++++++--- packages/analytics/Dockerfile | 24 +++++++++++++++--------- packages/analytics/Dockerfile.dev | 16 ---------------- server/Dockerfile | 25 +++++++++++++++++++------ server/Dockerfile.dev | 18 ------------------ 10 files changed, 59 insertions(+), 67 deletions(-) delete mode 100644 app/Dockerfile.dev delete mode 100644 packages/analytics/Dockerfile.dev delete mode 100644 server/Dockerfile.dev diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index ec3dd98..722cdba 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -69,6 +69,7 @@ jobs: with: context: . file: ./server/Dockerfile + target: prod push: true tags: docker.io/${{ secrets.DOCKERHUB_USERNAME }}/linux-odyssey:backend @@ -77,6 +78,7 @@ jobs: with: context: . file: ./app/Dockerfile + target: prod push: true tags: docker.io/${{ secrets.DOCKERHUB_USERNAME }}/linux-odyssey:app @@ -85,6 +87,7 @@ jobs: with: context: . file: ./packages/analytics/Dockerfile + target: prod push: true tags: docker.io/${{ secrets.DOCKERHUB_USERNAME }}/linux-odyssey:analytics diff --git a/app/Dockerfile b/app/Dockerfile index 8c9b986..89ded80 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,5 +1,5 @@ -# Build stage -FROM node as build-stage +# Base stage +FROM node:20-alpine as base WORKDIR /app COPY package.json yarn.lock ./ COPY app/package.json ./app/package.json @@ -7,14 +7,21 @@ COPY packages/file-graph/package.json ./packages/file-graph/package.json COPY packages/utils/package.json ./packages/utils/package.json RUN yarn install --frozen-lockfile +# Dev stage +FROM base as dev +WORKDIR /app/app +CMD [ "yarn", "dev:docker", "--host", "0.0.0.0" ] + +# Build stage +FROM base as build COPY app ./app COPY packages/file-graph ./packages/file-graph COPY packages/utils ./packages/utils RUN yarn build # Production stage -FROM nginx:stable-alpine as production-stage -COPY --from=build-stage /app/app/dist /usr/share/nginx/html +FROM nginx:stable-alpine as prod +COPY --from=build /app/app/dist /usr/share/nginx/html COPY deployment/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] diff --git a/app/Dockerfile.dev b/app/Dockerfile.dev deleted file mode 100644 index 7548510..0000000 --- a/app/Dockerfile.dev +++ /dev/null @@ -1,11 +0,0 @@ -FROM node - -WORKDIR /app -COPY package.json yarn.lock ./ -COPY app/package.json ./app/package.json -COPY packages/file-graph/package.json ./packages/file-graph/package.json -COPY packages/utils/package.json ./packages/utils/package.json -RUN yarn install --frozen-lockfile - -WORKDIR /app/app -CMD [ "yarn", "dev:docker", "--host", "0.0.0.0" ] \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8eacdc4..aeeeec4 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -5,6 +5,7 @@ services: build: context: . dockerfile: app/Dockerfile + target: prod networks: internal: ports: @@ -15,6 +16,7 @@ services: build: context: . dockerfile: server/Dockerfile + target: prod networks: - internal - players @@ -31,6 +33,7 @@ services: build: context: . dockerfile: packages/analytics/Dockerfile + target: prod depends_on: - db networks: diff --git a/docker-compose.testing.yml b/docker-compose.testing.yml index 31b78cf..cace521 100644 --- a/docker-compose.testing.yml +++ b/docker-compose.testing.yml @@ -17,6 +17,7 @@ services: build: context: . dockerfile: app/Dockerfile + target: prod networks: internal: ports: @@ -29,6 +30,7 @@ services: build: context: . dockerfile: server/Dockerfile + target: prod depends_on: - db-test networks: diff --git a/docker-compose.yml b/docker-compose.yml index edfe197a..d751e4f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,8 @@ services: - backend build: context: . - dockerfile: app/Dockerfile.dev + dockerfile: app/Dockerfile + target: dev ports: - 5173:5173 networks: @@ -18,7 +19,8 @@ services: - db build: context: . - dockerfile: server/Dockerfile.dev + dockerfile: server/Dockerfile + target: dev networks: - internal - players @@ -43,7 +45,8 @@ services: analytics: build: context: . - dockerfile: packages/analytics/Dockerfile.dev + dockerfile: packages/analytics/Dockerfile + target: dev depends_on: - db networks: diff --git a/packages/analytics/Dockerfile b/packages/analytics/Dockerfile index 69f71f4..64109ec 100644 --- a/packages/analytics/Dockerfile +++ b/packages/analytics/Dockerfile @@ -1,19 +1,25 @@ -FROM node +FROM node:20-alpine as build WORKDIR /app COPY ./package.json yarn.lock ./ COPY packages/analytics/package.json ./packages/analytics/package.json COPY packages/models/package.json ./packages/models/package.json RUN yarn install --frozen-lockfile --production - -COPY packages/analytics ./packages/analytics -COPY packages/models ./packages/models - -WORKDIR /app/packages/analytics - -ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=3001 EXPOSE 3001 -CMD [ "yarn", "start" ] \ No newline at end of file +# Production stage +FROM build as prod +COPY packages/analytics ./packages/analytics +COPY packages/models ./packages/models +ENV NODE_ENV=production +WORKDIR /app/packages/analytics +CMD [ "yarn", "start" ] + +# Development stage +FROM build as dev +RUN yarn install --frozen-lockfile +WORKDIR /app/packages/analytics +ENV NODE_ENV=development +CMD [ "yarn", "dev" ] diff --git a/packages/analytics/Dockerfile.dev b/packages/analytics/Dockerfile.dev deleted file mode 100644 index 1262872..0000000 --- a/packages/analytics/Dockerfile.dev +++ /dev/null @@ -1,16 +0,0 @@ -FROM node - -WORKDIR /app -COPY ./package.json yarn.lock ./ -COPY packages/analytics/package.json ./packages/analytics/package.json -COPY packages/models/package.json ./packages/models/package.json -RUN yarn install --frozen-lockfile - -WORKDIR /app/packages/analytics - -ENV NODE_ENV=development -ENV HOST=0.0.0.0 -ENV PORT=3001 -EXPOSE 3001 - -CMD [ "yarn", "dev" ] diff --git a/server/Dockerfile b/server/Dockerfile index 657c8e7..4424f7e 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM node +FROM node:20-alpine AS build WORKDIR /app COPY ./package.json yarn.lock ./ @@ -8,17 +8,30 @@ COPY packages/utils/package.json ./packages/utils/package.json COPY packages/models/package.json ./packages/models/package.json RUN yarn install --frozen-lockfile --production +ENV HOST=0.0.0.0 +ENV PORT=3000 +EXPOSE 3000 + +# Production +FROM build as prod + COPY ./server ./server COPY packages/file-graph ./packages/file-graph COPY packages/utils ./packages/utils COPY packages/models ./packages/models COPY quests ./quests +ENV NODE_ENV=production + WORKDIR /app/server -ENV NODE_ENV=production -ENV HOST=0.0.0.0 -ENV PORT=3000 -EXPOSE 3000 +CMD [ "yarn", "start" ] -CMD [ "yarn", "start" ] \ No newline at end of file +# Development +FROM build as dev + +RUN yarn install --frozen-lockfile + +ENV NODE_ENV=development + +CMD [ "yarn", "server" ] \ No newline at end of file diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev deleted file mode 100644 index a68525a..0000000 --- a/server/Dockerfile.dev +++ /dev/null @@ -1,18 +0,0 @@ -FROM node - -WORKDIR /app -COPY package.json yarn.lock ./ -COPY server/package.json ./server/package.json -COPY packages/file-graph/package.json ./packages/file-graph/package.json -COPY packages/utils/package.json ./packages/utils/package.json -COPY packages/models/package.json ./packages/models/package.json -RUN yarn install --frozen-lockfile - -COPY server/nodemon.json ./server/nodemon.json - -ENV NODE_ENV=development -ENV HOST=0.0.0.0 -ENV PORT=3000 -EXPOSE 3000 - -CMD [ "yarn", "server" ] \ No newline at end of file