improve Dockerfile build sequence#3274
Conversation
| echo 'download again Jeedom' | ||
| /root/install.sh -s 6 -v ${VERSION} -w ${WEBSERVER_HOME} | ||
| # jeedom installation : install composer | ||
| /root/install.sh -s 10 -v ${VERSION} -w ${WEBSERVER_HOME} -i docker |
There was a problem hiding this comment.
Petit souci de robustesse ici : step 10 appelle ${WEBSERVER_HOME}/resources/install_composer.sh pour installer composer, puis composer install. Ça suppose que step 6 juste avant a bien déballé le tarball avec ce script dedans. Si le wget de step 6 échoue partiellement (GitHub ralenti, réseau flaky au premier démarrage du conteneur), step 10 va tenter d'installer composer sur un répertoire incomplet et planter silencieusement — le conteneur continuera à démarrer avec un Jeedom cassé.
Je proposerais juste d'ajouter un check de retour entre les deux :
# do not re-install jeedom
if [ ! -f ${WEBSERVER_HOME}/core/config/common.config.sample.php ]; then
echo 'download again Jeedom'
if ! /root/install.sh -s 6 -v ${VERSION} -w ${WEBSERVER_HOME}; then
echo "ERROR: step 6 failed, aborting"
exit 1
fi
# jeedom installation : install composer
if ! /root/install.sh -s 10 -v ${VERSION} -w ${WEBSERVER_HOME} -i docker; then
echo "ERROR: step 10 failed, aborting"
exit 1
fi
fiComme ça si quelque chose foire, l'utilisateur voit le message dans les logs Docker au lieu d'avoir un conteneur qui tourne mais ne marche pas.
There was a problem hiding this comment.
Je ne suis pas sur, pour le coup, j'ai pas compris la notion de "échoue partiellement" : si le step est en erreur, ça n'interrompt pas le script ? Dans ce cas, on devrait ajouter ce genre d'option sur le script ?
#!/bin/bash
set -euo pipefail
Co-authored-by: kwizer15 <kwizer15@users.noreply.github.com>
Description
Pour éviter de recopier les sources lorsque ce n'est pas nécessaire, au démarrage du conteneur: le step (6) dans Dockerfile
COPY . ${WEBSERVER_HOME}fait déjà la copie des fichiers dans le répertoire courant.Pourtant je l'ai quand même laissé post-install dans le init.sh pour un cas particulier :
docker run -p 80:80 -v /home/pifou/jeedom:/var/www/html --rm --name jeedom_server jeedomAvec l'option -v je map le répertoire de l'host sur celui du container. Du coup ça permet de persister Jeedom sur l'host, et ça marche lors de l'arrêt / mise à jour / relance du container, on ne perd rien. Mais au 1er lancement, si mon rep /home/pifou/jeedom est vide sur l'host, il est vide aussi dans le container, malgré que je pensais y avoir copié les sources (lors du build). Dans ce cas uniquement, on doit recopier les sources au démarrage du conteneur.
C'est ce que je ne comprends pas dans la doc, normalement si le rep est vide on devrait y retrouver les données du container:
https://docs.docker.com/engine/storage/volumes/#mounting-a-volume-over-existing-data
Le fichier
.dockerignorepermet à l'instructionCOPY .de savoir ce qu'il faut ignorer - ne pas copier dans l'image.Le step 10 (install composer) se fait aussi au build de l'image, pas au démarrage de l'application. Donc dans le Dockerfile également.
Suggested changelog entry