201 private links
A good docker image boilerplate
The way it works is quite simple, you just have to copy and paste the content of your Dockerfile into the interface and the site gives you a list of recommendations to follow to improve your file.
- Partir d'une base légère
- Éliminer les FROM, RUN et COPY
- Placer les fichiers modifiés souvent à la fin du build de l'image si possible
- Utiliser le .dockerignore
- "tout ce qui n’est pas essentiel au fonctionnement de mon programme n’a pas sa place dans mon image."
With Authelia you can login once and get access to all your web apps safely from the Web thanks to two-factor authentication.
Authelia is an open source authentication and authorization server protecting modern web applications by collaborating with reverse proxies such as NGINX, Traefik and HAProxy. Consequently, no code is required to protect your apps.
A GUI for docker
A blog with pertinent posts related to dev topics
Une courte introduction
Dans un context avec de nombreux conteneurs, il vaut mieux partager les ressources que de créer des binaires statiques. Pour cela, toutes les images doivent partir de la même image de base.
Les binaires statiques ont un avantage : ils vont être utilisés dans des environnements hétérogènes.
Nettoyage de binaires et compression:
- suppression des symboles de debug avec l'outil
strip
- mettre les assets en dehors des conteneurs 🤔
- des outils exotiques:
- dockerSlim qui semble supprimer les fichier inutilisés
- Distroless si la taille compte vraiment, sinon Alpine fonctionne très bien :D
- Bazel pour les gros builds, mais vraiment très gros. C'est un outil complexe !
- Nix (le package manager) en combinaison avec Nixery: Nixery, c’est un registre de conteneurs “magique” : il génère à la volée des manifests d’images de conteneurs qui référencent des layers qui correspondent aux objets du Nix store.
- Récupérer les certificats SSL des autorités:
COPY --from=alpine /etc/ssl /etc/ssl
pour copier le dossier SSL de l'image Alpine - Récupérer les fichiers de timezone:
COPY --from=debian /usr/share/zoneinfo /usr/share/zoneinfo
; puis vérifier avec un retour deTZ=Europe/Paris date
- Pour les fichiers concernant les UID/GID, notamment pour exécuter des apps de bureau dans des conteneurs, on peut les génßerer localement, ou dans le conteneur, ou faire un
bind-mount
depuis l'hôte (via les volumes dans le dockerfile ?). Cf: un blog post
Donc la meilleure solution ? Ça dépend !
Sur Go et ses binaires statiques
Et Alpine Linux ❤️
→ 5Mo, avec un environnement Unix GNU/Linux cependant complet
→ son package manager rapide: dpk
→ Alpine utilise musl à la place de GNU C en tant que bibliothèque C standard, et comme ces deux bibliothèques ne sont pas compatibles, il faut compiler le binaire avec musl: soit avec des images officielles qui ont des tags :alpine
, soit directement depuis l'image Alpine.
Exemple de dockerfile :
FROM alpine
RUN apk add build-base
COPY hello.c .
RUN gcc -o hello hello.c
FROM alpine
COPY --from=0 hello .
CMD ["./hello"]
Pour java, il faut mettre la main dans le cambouis.
Pour les langages interprétés, ça passe oklm... sauf si des bibliothèques externes sont utilisées: soit le build est très long, soit on cherche le compromis avec des images taggés :slim
. Puis mettre les mains dans le cambouis pour savoir laquelle d'Alpine ou celle taggée :slim
produit la plus petite image.
Pour Rust ❤️ , il y a rust:alpine
et les binaires s'exécutent bien avec alpine
. La documentation renseigne sur la génération de binaires statiques
- Utiliser les multi-stage builds pour générer les artefacts dans l'environnement que l'ont veut, puis utiliser la dernière stage pour build l'image.
- Utiliser FROM scratch et construire des binaires statiques au besoin
So much cool informations about kernel interfaces and docker:
- Docker is basically built on top of kernel namespaces,
- On Unix systems, every processes information is stored inside
/proc
- Control the resources used through /sys/fs/cgroup interface (cgroup → control group)
- Inside each dir of cgroup, there is a docker directory ! These directories contain informations for each container.
Wow it is great to know the basics of the container under the hood !
La ligne FROM scratch
dans un dockerfile indique que l'image est construite à partir d'aucune dépendance. Elle nous permet de construire des images de base.
LOL. Lesson : don't copy/paste without knowing what's happening
Explanations in french by Korben : Une erreur de code sur StackOverflow perpétue un bug depuis plus de 10 ans
TL;DR
Don't use Alpine for Python images