
Prolog
KĂŒrzlich habe ich von einer "Pocket" PaaS mit einem ziemlich offensichtlichen Namen - Dokku - erfahren, die Heroku Ă€hnlich ist. Besonders angesprochen hat mich die Möglichkeit, einfach ein Zertifikat zur Anwendung und den vHost out of the box hinzuzufĂŒgen, weshalb ich beschlossen habe, meine Docker-Images auf Dokku zu ĂŒbertragen. Allerdings war ich enttĂ€uscht, dass es in Dokku keine Befehle wie bei Heroku gibt.
dokku container:push
dokku container:release
// Das wÀre sehr praktisch, aber bisher gibt es das noch nicht :(Es gibt einen Befehl der es ermöglicht, Images zu deployen, aber das Image muss zu diesem Zeitpunkt bereits auf dem Host sein. Mit anderen Worten, um das neu erstellte lokale Image auszurollen, muss es zuerst auf den Host kopiert werden.
tags:create # Tag zum neuesten laufenden App-Image hinzufĂŒgen
tags:deploy # Tagged App-Image deployen
tags:destroy # App-Image-Tag entfernenIch kenne mich mit Ansible aus und habe sogar damit einfache Pipelines fĂŒr die Bereitstellung des Backends erstellt, daher fiel die Wahl leicht. NatĂŒrlich könnte ich mich anstrengen und ein Plugin fĂŒr dokku schreiben, aber nein, nicht jetzt.
Playbook
Dieses Playbook archiviert ein lokales Image, kopiert es auf den Host, stellt es wieder her und deployt es in dokku. Ich habe es in einem Gitlab-Repository abgelegt. Es gibt noch viele Möglichkeiten zur Verbesserung.
push-image.dokku.yml
---
- name: "APP '{{ appname }}' AUF 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 '{{ image }}' zum Hochladen"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o "./{{ tarname }}" {{ image }}
- name: "Image '{{ image }}' nach dokku bei '{{ inventory_hostname }}' hochladen"
register: upload
copy:
src: "./{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Log - Upload-Ergebnis"
debug:
var: upload.dest
- name: "Hochgeladenes Docker-Image wiederherstellen"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Log - Image wiederherstellen"
debug:
var: restore.stdout_lines
- name: "Image auf '{{ dokku_image }}' neu taggen"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Dokku-Tag fĂŒr '{{ dokku_image }}' erstellen"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "'{{ appname }}' veröffentlichen"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Log - Veröffentlichung"
debug:
var: release.stdout_lines
Es wird davon ausgegangen, dass Ansible auf dem lokalen Rechner 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]
euer.domain.beispielQuelle: habr.com
