Utiliser des scripts d’entrypoint Docker flexible

Raphaël Pinson
Lorsqu’un container Docker démarre, il appelle son script d’entrypoint. La plupart du temps, il s’agit du chemin vers le service qui doit tourner dans ce container. Il est cependant très courant de lancer des scripts de wrapping afin de configurer le container avant de démarrer le service :
#!/bin/sh
# Create user
useradd myservice
# Setup config
sed -i "s/PASSWD/${SERVICE_PASSWORD}/g" /etc/myservice.conf
# Start service
exec /usr/sbin/myservice "$@"
view rawmonolithic_entrypoint.sh hosted with ❤ by GitHub
Bien souvent, cette tâche est effectuée à l’aide d’un script d’entrypoint monolithique contenant toutes les options de paramétrisation nécessaires au container. Cette approache a plusieurs inconvénients:
- les images héritées doivent faire une copie du script pour ajouter des paramètres
- le script est complexe à maintenir
- le script est écrit dans un seul langage (généralement en script shell)
Chez Camptocamp, en travaillant sur la dockerisation de Puppet sous Rancher, nous avons fait le choix d’une approche plus flexible des scripts d’entrypoint en utilisant un script standard et statique faisant appel à la commande run-parts sur un répertoire :
#!/bin/bash
DIR=/docker-entrypoint.d
if [[ -d "$DIR" ]]; then
/bin/run-parts --verbose "$DIR"
fi
exec "$@"
view rawparts_entrypoint.sh hosted with ❤ by GitHub
Cela procure plusieurs avantages :
- le script d’entrypoint est standard dans tous nos containers
- les scripts d’entrypoint sont des plugins qui peuvent être écrits dans d’importe quel langage
- les images héritées peuvent ajouter de nouveaux scripts d’entrypoint dans le répertoire /docker-entrypoint.d/
Nos Dockerfiles contiennent généralement des appels à ONBUILD COPY pour faciliter le déploiement de scripts d’entrypoint additionnels. Nous pouvons ensuite régler l’entrypoint pour appeler le script générique avec le chemin vers le service à démarrer, par exemple :
COPY /docker-entrypoint.sh
COPY /docker-entrypoint.d/* /docker-entrypoint.d/
ONBUILD COPY /docker-entrypoint.d/* /docker-entrypoint.d/
ENTRYPOINT ["/docker-entrypoint.sh", "/opt/puppetlabs/puppet/bin/mcollectived"]
CMD ["--no-daemonize"]
view rawDockerfile hosted with ❤ by GitHub
Plusieurs exemples de scripts d’entrypoint peuvent être trouvés dans nos projets Docker.
Contact us for more information!
Carrière
Vous souhaitez travailler dans un environnement inspirant et rejoindre nos équipes motivées et multiculturelles ?