Deploy di Docker Image su Dokku con Ansible

Deploy di Docker Image su Dokku con Ansible

Prologo

Recentemente ho scoperto un PaaS "portatile" simile a Heroku con un nome piuttosto evidente: Dokku. Sono rimasto molto colpito dalla possibilità di aggiungere facilmente un certificato all'app e al vhost direttamente, quindi ho deciso di migrare le mie immagini Docker su Dokku. Tuttavia, sono rimasto deluso dal fatto che in Dokku non ci siano comandi simili a quelli di Heroku.

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

Esiste un comando tags che consente di distribuire le immagini, ma l'immagine stessa deve essere già presente sull'host in quel momento. In altre parole, per distribuire un image locale appena creato, è necessario prima copiarlo sull'host.

tags:create                          # Aggiungi un tag all'immagine dell'app in esecuzione più recente
tags:deploy                          # Distribuisci l'immagine dell'app etichettata
tags:destroy                         # Rimuovi il tag dell'immagine dell'app

Conosco Ansible e ho persino creato con esso pipeline semplici per la distribuzione del backend, quindi la scelta era semplice. Certo, avrei potuto scrivere un plugin per dokku, ma no, non adesso.

Playbook

Questo playbook archivia un determinato image locale, lo copia sull'host, lo ripristina e lo distribuisce in dokku. L'ho caricato nel repository di Gitlab. Ci sono molte possibilità di miglioramento.

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: "Archivia '{{ image }}' per il caricamento"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Carica l'immagine '{{ image }}' su dokku su '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Risultato del caricamento"
        debug:
          var: upload.dest

      - name: "Ripristina l'immagine Docker caricata"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Ripristina immagine"
        debug:
          var: restore.stdout_lines

      - name: "Retagga immagine a '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

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

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

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

si suppone che ansible sulla macchina locale e dokku sull'host siano già installati

Usa così

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

some_inventory

[dokku_hosts]
tuo.dominio.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