Bonjour à tous !

Ce que je veux

J'ai suivi le tutoriel de Grafikart pour passer sur PNPM et le Monorepo.

Je me retrouve donc avec mon app :

  • apps/
    nextjs/ - front de mon app en TS
    strapi/ - le back/api avec Strapi CMS
  • packages/
    ui/ - des composants graphiques pour mon front
    lib-srd/ - une bibli outils pour mon besoin

Et je voulais donc dockeriser tout cela pour créer un conteneur Front, et un conteneur pour Strapi (mes bases de données sont déjà hébergées ailleurs).
Bien évidemment, je débute sur Docker ^^

J'ai pu voir avec mes premières recherche que ce n'était pas si simple (de ce que j'ai compris, certains passent par un premier conteneur avec l'ensemble du projet pour tout build, enfin ce n'est pas très clair).

Donc si jamais quelqu'un a des conseils ou un tuto pour bien aborder cette dockerisation ... merci d'avance !

5 réponses


popotte
Réponse acceptée

Alors plusieurs solutions, soit tu ouvres un volume pour placer ton cache PNPM https://docs.docker.com/storage/volumes

Soit la meilleure pratique c'est bien de passer par un Dockerfile qui fait un premier build puis le passe à un deuxième docker que tu utiliseras, ça a aussi l'avantage d'alléger ton container (vu que node_modules ça dégage :p)

et c'est pas compliqué:

FROM node:lts as build

WORKDIR /app

ADD ./:/

RUN npm i -g pnpm && pnpm install && pnpm build && rm -rf node_modules

FROM node:lts # Quand tu fais un deuxième FROM, le premier reste de coté le temps de build ton container puis sera supprimé

COPY --from=build /app:/app

...

Avec cette config il n'y a plus de probleme de pnpm, tu aura dans ton container un js déjà compilé, pas de node_mudules, tout sera dans un app.js :p

Après pour le soucis de Cyberpanel... ok si vraiment y a pas moyen d'utiliser docker compose alors la seule solution est de faire un OS Docker :/

FROM node:lts as js

# Ici tu place ton js, package(-lock).json, et un dist, tu utilises pnpm pour build le JS dans un fichier app.js, et c'est tout

FROM strapi:latest as backend

# Ici tu installes composer et tu build ton back strapi

FROM ubuntu:latest

RUN apt get upgrade && apt get # Tu installes toutes les dépendances, comme nodejs, build-essentials, etc... y a plein de pilotes à installer :p

WORKDIR /app

COPY ./ /app
COPY --from=js /dist/app.js /app/assets/js/app.js # enfin tu copies ton fichier js la ou il doit se trouver dans ton projet
COPY --from=backend /var/lib/mysql /var/lib/mysql # si tu utilises mysql
COPY --from=backend # et si y a d'autres fichiers ou dossier à copier depuis ton build backlend vers ta VM ubuntu faut les copier aussi

Bref, sans docker compose faut utiliser docker comme une VM, tu fais des container node strapi etc, tu build ce dont tu as besoin, et le dernier from ce sera un OS complet comme ubuntu ou debian ^^'

Sinon si t'es ouvert à l'idée de changer d'hébergeur, je te conseilles AWS, tu fou ton docker compose sur EC2; et c'est plié (important, ne fait RIEN depuis le panel, utilises Terraform, sinon tu vas le regretter :p) :)

Hello :)

Alors c'est une galère de jsute utiliser Docker pour un truc de ce genre, il faut que tu utilises Docker Compose (c'est un gestionnaire de multi-Docker)

Pour le docker-compose.yml faudra faire un truc du genre:

version: "3"

services:
    front:
        container_name: "le_nom_de_ton_appli-front"
        dockerfile: path/vers/ton/Dockerfile
        restart: unless-stopped
        ports:
            - "3000:3000"
        depends_on: back

    back:
        container_name: "le_nom_de_ton_appli-back"
        image: strapi:latest # Utilises un Dockerfile si t'as besoin de custom
        restart: unles-stopped
        ports:
            - "3306:3306"
        volumes:
            tes-datas:/datas

Bon en gros ça ressemble vite fait à ça, mais dans l'état ça va pas fonctionner vu que j'ai fais à l'aveugle :p ensuite y a juste à chercher sur google des exemples de dockercompose/Dokerfile dans ton cas, quad tu sera à l'aise avec ça tu pourras optimiser le tout :p

Pheldwyn
Auteur

Salut !
Merci pour ta réponse.

Alors oui, j'ai déjà un peu joué avec Docker Compose (bon, mon problème c'est que j'utilise Cyberpanel pour héberger mes conteneurs, et je ne crois pas qu'il gère docker-compose)

Mais mon soucis est davantage lié à l'aspect monorepo de PNPM : comme les conteneurs utilisent les mêmes librairies, que celles-ci sont en dehors des deux dossiers nextsjs et strapi, ne serait-ce que dockerizer l'un ou l'autre est plus complexe que dans un usage plus classique.

C'est face à cette difficulté que je recherche des infos pour la marche à suivre.
De ce que j'ai vu, il s'agit de créer une "première couche" qui builde tout, et après il s'agit de copier uniquement des fichiers qui nous intéressent suivant le conteneur qu'on met en place ... mais je n'ai pas trouvé un tutoriel et une explication claire, les exemples que je trouve intègrent d'autres fonctionnalités plus poussées j'ai l'impression (pour des gains de performances ... moi je cherche déjà dans un premier temps à pouvoir avoir deux conteneurs de base, déjà, ce serait bien ^^)

Pheldwyn
Auteur

Merci beaucoup !

Bon, ça reste encore un peu nébuleux pour les détails, mais je pense avoir compris les grandes lignes.

J'avoue que ton
"FROM node:lts # Quand tu fais un deuxième FROM, le premier reste de coté le temps de build ton container puis sera supprimé"
... m'a permis d'avoir une bonne clé de compréhension sur les exemples que j'avais vu.

Bah j'avais installé un cyberpanel sur une VM Cloud OVH, c'est pour héberger des sites persos pour l'essentiel, dont certains sont en PHP (alors oui, je pourrais tout dockeriser).
Mais bon, pour le moment je vais rester sur cet hébergement, je verrais ensuite.

D'ailleurs ta seconde solution m'intéresse dans le sens où ça me permettrait de gérer un seul conteneur par site sur le même modèle (Nextjs+strapi), plutôt que 2 à cahque fois.
Mais peut-être que cela bouffe davantage de ressources ?

En tous les cas, merci pour tes réponses !
Je risque de revenir en poser ^^

Pheldwyn
Auteur

Il y a un truc que je n'ai pas saisi. Si je reprend mon architecture :

/

  • pnpm-worspace.yaml
  • apps/
    - nextjs/ - front de mon app en TS
    • strapi/ - le back/api avec Strapi CMS
      -packages/
    • ui/ - des composants graphiques pour mon front
      - lib-srd/ - une bibli outils pour mon besoin

Si j'utilise la première solution, à quel niveau dois-je faire mon Dockerfile ?
là où se situe mon pnp-workspace ? ... ou au niveau du dossier nextjs (et un autre Dockerfile au niveau du strapi) ?

Je suppose que cette seconde solution : mais que dois-je copier dans la première couche dans mon Dockerfile ?
Car là, on ne copiant que le package.json de nextjs ... lors du pnpm install il me dit qu'il ne trouve pas de paquet correspondant à ma dépendance "lib-srd".

(bon, j'avoue, il faut aussi que je revois les bases de docker ^^)

Avec plaisir ^^

Ah oui sit c'est pour des sites persos ce serait pas mal de trouver une solu dockercompose pour tout rassembler x)

Alors pour PNPM, faut que tu installes PNPM dans ton image nodejs, puis que tu fasses un install, après si tu veux caler ton répertoire PNPM faut faire un COPY :)

 COPY /path/to/PNPM ~/.local/share/pnpm/store

Je ne suis pas sur du path, mais il me semble que sur Linux pnpm se trrouve dans .local/share