Deploy Docker Image su Dokku con Ansible

Deploy Docker Image su Dokku con Ansible

Prologo

Recentemente ho scoperto un PaaS 'portatile' simile a Heroku con un nome piuttosto esplicito: Dokku. Mi ha colpito molto la possibilità di aggiungere facilmente certificati all'app e vhost out of the box, quindi ho deciso di trasferire le mie immagini docker su Dokku. Tuttavia, sono rimasto deluso dal fatto che Dokku non ha comandi simili a quelli di Heroku.

dokku container:push
dokku container:release
// Sarebbe molto comodo, ma non è ancora disponibile :(

Esiste un comando tags che consente di deployare le immagini, ma l'immagine deve già trovarsi sull'host in quel momento. In altre parole, per rilasciare un'immagine locale appena creata, deve prima essere copiata sull'host.

tags:create <app> <tag>                        # Aggiungi tag all'immagine dell'app in esecuzione più recente
tags:deploy <app> <tag>                        # Deploy dell'immagine dell'app con tag
tags:destroy <app> <tag>                       # Rimuovi il tag dall'immagine dell'app

Conosco Ansible e ho persino creato con esso semplici pipeline per il delivery del backend, quindi la scelta è stata semplice. Si potrebbe certamente anche faticare e scrivere un plugin per dokku, ma no, non adesso.

Playbook

Questo playbook archivia un'immagine locale, la copia sull'host, la ripristina e la deploya in dokku. L'ho inserito in un repository Gitlab. Ci sono molte opportunità per miglioramenti futuri.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "DEPLOY APP '{{ appname }}' TO 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: "Archive '{{ image }}' to upload"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "../{{ tarname }}" {{ image }}

      - name: "Upload image '{{ image }}' to dokku at '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: ".../{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Upload result"
        debug:
          var: upload.dest

      - name: "Restore uploaded docker image"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Restore image"
        debug:
          var: restore.stdout_lines

      - name: "Retag image to '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Create dokku tag for '{{ dokku_image }}'"
        shell: 
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

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

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

si presume che ansible sia già installato sulla macchina locale e dokku sull'host

Usare così

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

some_inventory

[dokku_hosts]
tuodominio.esempio

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster