
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 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'applicationJe 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
---
- 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.exempleSource : habr.com
