
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 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'appConosco 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
---
- 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.esempioFonte: habr.com
