Des bonnes pratiques pour vos Dockerfile avec Node.
Il y a juste débat sur 10. Prefer smaller Docker base images, j'ai lu ailleurs qu'une image trop légère implique que certains outils nécessaires pour la stabilité son parfois manquants et peuvent engendrer des surprises.
Un projet qui vise à faire tourner Windows dans un container Docker.
Via https://korben.info/windows-docker-xp-11-vista-7-8-10-server-2016-2019-2022-rdp-kvm.html
"Distroless" se réfère au fait d'avoir une image dénuée du moindre outil UNIX tel que wget, sed, grep, cp, etc.
En pratique c'est compliqué parce que ces outils sont souvent nécessaire au démarrage du container pour le configurer en fonction de l'environnement dans lequel il tourne par exemple. Mais ces outils augmentent la surface d'attaque potentielle alors qu'ils ne sont pas utiles au delà des premières secondes de vie du container.
La solution se situe dans l'utilisation d'init container. Il s'agit d'un container standard qui n'aura pour but que d'effectuer cette configuration au démarrage, et il s'arrêtera ensuite.
Des conseils sur l'écriture d'un Dockerfile optimisé pour des applications Node.js.
Une alternative à Docker Desktop qui se dit plus rapide et légère. Pas testé.
Une saine lecture pour comprendre quels sont les risques de sécurités liés à l'utilisation de Docker et comment les limiter au maximum.
Le principe de limiter les privilèges au maximum et de n'ajouter que le strict nécessaire au fur et à mesure est une très bonne pratique, malheureusement trop peu souvent appliquée par manque de temps.
Un outil pour analyser une image Docker et proposer des outils pour l'optimiser.
Via https://korben.info/explorer-optimiser-images-docker-avec-dive.html
Définir des limites de mémoire et de CPU à un container Docker.
En ligne de commande:
docker run -m 512m --memory-reservation=256m --cpus=2 nginx
Avec Docker Compose:
service:
image: nginx
mem_limit: 512m
mem_reservation: 128m
cpus: 0.5
ports:
- "80:80"
Des bonnes pratiques à adopter pour créer des images Docker de vos apps Node.js.
Enfin des images Docker PHPUnit dignes de ce nom et à jour !
Quelques instructions pour améliorer vos Dockerfile pour Node.js.
# Utiliser une version de Node spécifique pour éviter les surprises lors de nouvelles releases.
FROM node:19.4-alpine
# Configurer Node pour la production.
ENV NODE_ENV production
# Sélectionner un répertoire de travail explicitement.
WORKDIR /usr/src/app
# Copier uniquement les fichiers requis pour installer les dépendances pour une meilleure gestion du cache.
COPY package*.json ./
# Installer uniquement les dépendances de production.
RUN npm ci --only=production
# alternative pour bénéficier du cache :
RUN --mount=type=cache,target=/usr/src/app/.npm \
npm set cache /usr/src/app/.npm && \
npm ci --only=production
# Éviter le mode root.
USER node
# Copier le reste du code source (uniquement les fichiers indispensables) après installation des dépendances.
COPY --chown=node:node ./src/ .
# Indiquer explicitement le port exposé par les containers qui utilisent cette image.
EXPOSE 3000
CMD ["node", "index.js"]
Au taf, on utilise Redhat. On utilise aussi Docker. Et hier un admin server m'a appris que Kubernetes et Redhat 8 vont arrêter de supporter officiellement Docker au profit de Podman. Ça remet en question les fondations de la façon dont on développe et dont on expose nos applications, donc j'étais un peu comme ça 😱
Du coup, voici un bon article qui détaille les différences entre Docker et Podman.
Un outil pour gérer Docker dans le terminal.
Via https://korben.info/interface-docker-docker-compose.html
Un Dockerfile simple pour créer une image Docker d'application Node.js qui permet de faire des requêtes sur DB Oracle (il faut aller voir l'update 3 en bas de la page pour la version la plus pertinente).
Il manque juste wget. Je copie colle ma version très légèrement modifiée ci-dessous :
FROM node:16-buster-slim
WORKDIR /tmp
RUN apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get install -y alien libaio1 wget
RUN wget https://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient19.3-basiclite-19.3.0.0.0-1.x86_64.rpm
RUN alien -i --scripts oracle-instantclient*.rpm
RUN rm -f oracle-instantclient19.3*.rpm && apt-get -y autoremove && apt-get -y clean
WORKDIR /myapp
ADD package.json /myapp/
ADD index.js /myapp/
RUN npm install
CMD exec node index.js
Faire tourner MacOS graphiquement dans Docker. Pas essayé mais c'est assez impressionnant.
Un topo sur Docker Compose.
Une très bonne introduction à Docker pour qui ne s'est pas encore jeté dans cet univers.