From f051938ace0d758a78ab8749006e84528594ac90 Mon Sep 17 00:00:00 2001 From: antoine lebaud Date: Mon, 1 Jul 2024 20:30:00 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20introduce=20frontend=20Do?= =?UTF-8?q?cker=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inspired by the Docker images from numerique-gouv/people and numerique-gouv/impress (see commit 1a3b396 in the "people" repository). Due to the lack of a certified cold storage solution (e.g., S3) for serving static files, we've containerized the frontend as a temporary deployment solution. Vite.js static output is served using an Nginx reverse proxy. I am not quite sure of this commit, please @manuhabitela could you review how I exposed the static build from vite in my Nginx server? and do the appriopriate fix if necessary. --- src/frontend/Dockerfile | 50 +++++++++++++++++++++++++++++++++++++++ src/frontend/default.conf | 15 ++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/frontend/Dockerfile create mode 100644 src/frontend/default.conf diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile new file mode 100644 index 00000000..4036763d --- /dev/null +++ b/src/frontend/Dockerfile @@ -0,0 +1,50 @@ +FROM node:20-alpine as frontend-deps + +WORKDIR /home/frontend/ + +COPY ./src/frontend/package.json ./package.json +COPY ./src/frontend/package-lock.json ./package-lock.json + +RUN npm ci + +COPY .dockerignore ./.dockerignore +COPY ./src/frontend/ . + +### ---- Front-end builder image ---- +FROM frontend-deps as meet + +WORKDIR /home/frontend + +FROM frontend-deps as meet-dev + +WORKDIR /home/frontend + +EXPOSE 3000 + +CMD [ "npm", "run", "dev"] + +# Tilt will rebuild Meet target so, we dissociate meet and meet-builder +# to avoid rebuilding the app at every changes. +FROM meet as meet-builder + +WORKDIR /home/frontend + +RUN npm run build + +# ---- Front-end image ---- +FROM nginxinc/nginx-unprivileged:1.25 as frontend-production + +# Un-privileged user running the application +ARG DOCKER_USER +USER ${DOCKER_USER} + +COPY --from=meet-builder \ + /home/frontend/dist \ + /usr/share/nginx/html + +COPY ./src/frontend/default.conf /etc/nginx/conf.d +COPY ./docker/files/usr/local/bin/entrypoint /usr/local/bin/entrypoint + +ENTRYPOINT [ "/usr/local/bin/entrypoint" ] + +CMD ["nginx", "-g", "daemon off;"] diff --git a/src/frontend/default.conf b/src/frontend/default.conf new file mode 100644 index 00000000..fe8f1cb9 --- /dev/null +++ b/src/frontend/default.conf @@ -0,0 +1,15 @@ +server { + listen 8080; + server_name localhost; + + root /usr/share/nginx/html; + + location / { + try_files $uri index.html $uri/ =404; + } + + error_page 404 /404.html; + location = /404.html { + internal; + } +}