J'utilise jenkins pour créer des images docker et les pousser vers Docker Hub avec la balise la plus récente à chaque fois. J'ai écrit un playbook ansible qui déploiera les images du docker en extrayant la dernière image du hub docker.Maintenant, le problème est que les nouvelles dernières images n'ont pas été extraites par ansible une fois qu'il a déployé sa version précédente avec le même tag.Pouvez-vous s'il vous plaît vérifier le playbook et faites-moi savoir quelle partie dois-je mettre à jour pour obtenir le travail souhaité.
Playbook:
--- - hosts: flask04 tasks: - name: Pull Flask app image docker_image: name: taybur/flaskapp_27032019 tag: latest state: present - name: remove flask app container docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 state: absent - name: Create flask app container docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 ports: - "5001:5001" state: started
3 Réponses :
Je supprime généralement l'ancienne image dans le cadre du nettoyage avant l'installation. Vous devez d'abord supprimer l'image, tout comme vous supprimez le conteneur. Cela obligera ansible à extraire la nouvelle version de l'image.
--- - hosts: flask04 tasks: - name: Remove Flask app image docker_image: name: taybur/flaskapp_27032019 tag: latest force: true state: absent - name: Pull Flask app image docker_image: name: taybur/flaskapp_27032019 tag: latest state: present - name: remove flask app container docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 state: absent - name: Create flask app container docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 ports: - "5001:5001" state: started
Vous pouvez faire tout cela en une seule tâche qui se chargera de mettre à jour l'image et de redémarrer le conteneur sur la nouvelle image uniquement lorsque cela est nécessaire. Voir ma réponse.
Le module docker_image
ne tirera pas automatiquement l'image si elle est déjà présente. Vous devez utiliser le paramètre force: yes
pour forcer le tirage à chaque exécution.
De plus, docker_container
peut extraire l'image pour vous si elle n'est pas présente. Et vous pouvez lui dire d'essayer de tirer à chaque exécution ( pull: true
) et de redémarrer le conteneur si nécessaire. Vous pouvez donc réduire votre ensemble de tâches à une seule dans ce cas:
- name: Create/Update the flask app container if needed docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 pull: "{{ upgrade_flaskapp | default(false) | bool }}" restart_policy: always ports: - "5001:5001" state: started
Voir la documentation du module pour docker_container et docker_image
Pour aller plus loin :
restart_policy: always
si vous avez besoin de cette fonctionnalité. pull
avec une variable que vous utiliserez comme var supplémentaire sur la ligne de commande: - name: Create/Update the flask app container if needed docker_container: name: first_flaskapp image: taybur/flaskapp_27032019 pull: true ports: - "5001:5001" state: started
Maintenant, si vous exécutez le playbook normalement, il:
Si votre course avec ansible-playbook -i
cela va:
Idéalement, nous devrions avoir nos tâches / rôles idempotents (ignorer le travail en double s'il est exécuté à plusieurs reprises). Donc, je pense qu'il est plus simple de baliser vos builds avec les numéros de version et d'utiliser le numéro de version dans votre déploiement au lieu du dernier.