Déploiement d'une image Docker sur Dokku à l'aide d'Ansible

Déploiement d'une image Docker sur Dokku à l'aide d'Ansible

Prologue

Récemment, j'ai découvert un PaaS « de poche » similaire à Heroku avec un nom plutôt explicite : Dokku. J'ai été particulièrement attiré par la possibilité d'ajouter facilement un certificat à une application et un vhost prêt à l'emploi, donc j'ai décidé de migrer mes images Docker vers Dokku. Cependant, j'ai été déçu de constater qu'il n'y a pas de commandes dans Dokku similaires à celles de Heroku.

dokku container:push
dokku container:release
// Ce serait très pratique, mais ce n'est pas encore le cas :(

Il existe une commande tags qui permet de déployer des images, mais l'image doit déjà être sur l'hôte à ce moment-là. En d'autres termes, pour déployer une image locale que vous venez de créer, vous devez d'abord la copier sur l'hôte.

tags:create                          # Ajouter une étiquette à la dernière image d'application en cours
tags:deploy                          # Déployer l'image d'application étiquetée
tags:destroy                         # Supprimer l'étiquette de l'image d'application

Je connais Ansible et j'ai même créé des pipelines simples pour la livraison de backend avec, donc le choix était évident. Bien sûr, je pourrais me casser la tête et écrire un plugin pour Dokku, mais non, pas maintenant.

Playbook

Ce playbook archive une certaine image locale, la copie sur l'hôte, la restaure et la déploie dans Dokku. Je l'ai placé dans un dépôt GitLab. Il y a encore beaucoup de possibilités d'amélioration.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "DÉPLOYER L'APPLICATION '{{ appname }}' SUR DOKKU"
    hosts: dokku_hosts
    remote_user: root
    gather_facts: false
    vars:
      tarname: "{{ appname }}__{{ image }}.tar"
      upload_dir: "\/usr\/local\/src"
      upload_path: "{{ upload_dir }}\/{{ tarname }}"
      apptag: "{{ upload_tag | default('latest') }}"
      dokku_image: "dokku\/{{ appname }}:{{ apptag }}"

    tasks:
      - name: "Archiver '{{ image }}' pour le téléchargement"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o ".\/{{ tarname }}" {{ image }}

      - name: "Télécharger l'image '{{ image }}' sur dokku à '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: ".\/{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Résultat du téléchargement"
        debug:
          var: upload.dest

      - name: "Restaurer l'image Docker uploadée"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Restaurer l'image"
        debug:
          var: restore.stdout_lines

      - name: "Re-taguer l'image en '{{ dokku_image }}'"
        shell:
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Créer l'étiquette dokku pour '{{ dokku_image }}'"
        shell:
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

      - name: "Publier '{{ appname }}'"
        register: release
        shell:
          cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"  

      - name: "Log - Publication"
        debug:
          var: release.stdout_lines  

Il est supposé qu'Ansible sur la machine locale et Dokku sur l'hôte sont déjà installés.

Utilisez comme suit

ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"

some_inventory

[dokku_hosts]
votre.domaine.exemple

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster