
Prolog
Kürzlich habe ich von einer "Pocket" PaaS ähnlich wie Heroku mit einem ziemlich offensichtlichen Namen erfahren – Dokku. Die Möglichkeit, einfach ein Zertifikat zu einer Anwendung und vhost von Haus aus hinzuzufügen, hat mich sehr angesprochen, also habe ich beschlossen, meine Docker-Images auf Dokku zu migrieren. Leider war ich enttäuscht, dass es in Dokku keine Befehle gibt, die denen von Heroku ähneln.
dokku container:push
dokku container:release
// Das wäre wirklich praktisch, aber es gibt sie noch nicht :(Es gibt einen Befehl der das Deployment von Images ermöglicht, jedoch muss das Image zu diesem Zeitpunkt bereits auf dem Host sein. Mit anderen Worten, um ein gerade erstelltes lokales Image auszurollen, muss es zuerst auf den Host kopiert werden.
tags:create <app> <tag> # Tag zum neuesten laufenden App-Image hinzufügen
tags:deploy <app> <tag> # Getaggtes App-Image bereitstellen
tags:destroy <app> <tag> # Tag des App-Images entfernenIch bin mit Ansible vertraut und habe sogar damit einfache Pipelines für die Bereitstellung von Backend erstellt, daher war die Wahl einfach. Man könnte natürlich versuchen, ein Plugin für Dokku zu schreiben, aber nicht jetzt.
Playbook
Dieses Playbook archiviert ein gewisses lokales Image, kopiert es auf den Host, stellt es wieder her und deployed es in Dokku. Ich habe es in einem Gitlab-Repository platziert. Es gibt noch viele Möglichkeiten zur Verbesserung.
push-image.dokku.yml
---
- name: "APP '{{ appname }}' ZU DOKKU BEREITSTELLEN"
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: "Archivieren von '{{ image }}' zum Hochladen"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o "./{{ tarname }}" {{ image }}
- name: "Bild '{{ image }}' zu dokku bei '{{ inventory_hostname }}' hochladen"
register: upload
copy:
src: "./{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Log - Uploadergebnis"
debug:
var: upload.dest
- name: "Hochgeladenes Docker-Bild wiederherstellen"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Log - Bild wiederherstellen"
debug:
var: restore.stdout_lines
- name: "Bild zu '{{ dokku_image }}' umtaggen"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Dokku-Tag für '{{ dokku_image }}' erstellen"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "'{{ appname }}' freigeben"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Log - Freigabe"
debug:
var: release.stdout_lines
Es wird vorausgesetzt, dass Ansible auf der lokalen Maschine und Dokku auf dem Host bereits installiert sind.
So verwenden
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
Ihr.domain.beispielQuelle: habr.com
