5.2 KiB
\newpage
Le point d'entrée du conteneur
Le point d'entrée ou l'entrypoint correspond à la ligne de commande qui sera
exécutée au lancement du conteneur. Deux paramètres de notre Dockerfile
permettent de changer cette ligne de commande : CMD
{.dockerfile} et
ENTRYPOINT
{.dockerfile}.
-
CMD
{.dockerfile} est la commande par défaut : lorsqu'au moment derun
, aucun paramètre n'est passé après le nom de l'image, le contenu du dernierCMD
{.dockerfile} rencontré sera utilisé. -
ENTRYPOINT
{.dockerfile}, s'il est défini, sera réellement exécuté, qu'il y ait ou non des arguments pour remplacer la ligne de commande. Lorsque des arguments sont passés ou qu'unCMD
{.dockerfile}, ceux-ci sont passés en argument de l'ENTRYPOINT
{.dockerfile}.
Par exemple, avec le Dockerfile
suivant, construisant l'image sample-echo
:
Nous obtenons les résultats suivants :
Dans ce premier cas, il n'y a pas d'argument après le nom de l'image, c'est
donc le contenu de CMD
{.dockerfile} qui est utilisé ; il est donc passé en
argument à l'ENTRYPOINT
{.dockerfile}. Concrètement, la première ligne de
commande exécutée est :
Essayons maintenant avec des arguments :
Le contenu de la variable $USER
, interprété par notre shell, est utilisé à la
place de CMD
{.dockerfile}.
Si l'on a besoin d'exécuter un ENTRYPOINT
{.dockerfile} différent, il reste la
possibilité de le surcharger au moyen d'un argument :
Personnalisation basique
Afin de faire bénéficier à nos utilisateurs d'une immersion parfaite, nous allons faire en sorte que notre image puisse être utilisée ainsi :
Plutôt que de laisser l'utilisateur se débrouiller avec le chemin interne dans lequel il va trouver le bon binaire :
Essayez les deux commandes, si vous avez utilisé l'instruction
CMD
{.dockerfile} dans votre Dockerfile
jusqu'à présent, vous devriez vous
trouver dans le deuxième cas.
Pour améliorer la situation, définissez
l'ENTRYPOINT
{.dockerfile}
de votre image sur le binaire /srv/youp0m
.
Point d'entrée avancé
Dans certains cas, il peut être nécessaire au lancement d'un conteneur de
faire un minimum d'étapes d'initialisation avant que le conteneur ne soit
opérationnel (rappelez-vous les options que l'on passait à l'image mysql
pour
créer un utilisateur et une base).
Notre but, dans cette partie, sera de créer un utilisateur administrateur (pouvant passer le contrôle d'accès http://localhost:8080/admin/) :
Bases du script
Notre script d'ENTRYPOINT
{.dockerfile} sera appelé avec en argument, ceux
passés par l'utilisateur après le nom de l'image, ou, à défaut, le contenu de
CMD
.
C'est donc l'ENTRYPOINT
{.dockerfile} qui est responsable de la bonne
utilisation de ceux-ci, de leur modification, ...
À la fin d'un script d'ENTRYPOINT
{.dockerfile}, afin de garder comme premier
processus du conteneur le programme qui nous intéresse, on réalise un
execve(2)
, sans fork(2)
:
Dans cet exemple : exec
est la commande interne à notre shell pour lui
indiquer de remplacer son fil d'exécution par cette commande (sans exec
, il
va fork(2)
avant). $@
est ici pour transmettre tel quel la liste des
arguments passés au script (il s'agit de ceux donnés par l'utilisateur, sur la
ligne de commande du run
, ou du contenu de CMD
{.dockerfile} si
l'utilisateur n'a rien précisé).
Format du fichier htpasswd
Le format attendu est celui d'un fichier htpasswd
typique d'Apache. Nous
pouvons obtenir un fichier valide avec :
Il faut ensuite passer le chemin du fichier créé sur la ligne de commande grâce
à l'option -htpasswd
.
Exercice {-}
Écrivez un script d'ENTRYPOINT
{.dockerfile}, analysant les variables
d'environnement, à la recherche de YOUP0M_USERNAME
et YOUP0M_PASSWORD
pour
initialiser le fichier .htpasswd
qui sera ajouté à la liste des arguments à
passer au service.
Par exemple :
42sh$ curl -u admin:badpasswd http://localhost:8081/admin/ You are not allowed to perform this request.
42sh$ curl -u admin:admin http://localhost:8081/admin/
</div>