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.

Docker
Training

With this intensive, 2-day Docker training (Open Source, Linux based), you will understand the concepts related to Docker from development to production.

Kubernetes
Training

With this 2-day, comprehensive Kubernetes training, you will understand the concepts and architecture of Kubernetes (K8s) in order to use it to deploy microservice applications.

Contact us for more information!

En soumettant ce formulaire, j'accepte que les informations saisies soient utilisées aux fins décrites dans la politique de confidentialité.

Carrière

Vous souhaitez travailler dans un environnement inspirant et rejoindre nos équipes motivées et multiculturelles ?