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