Bereitstellung eines Docker-Images auf Dokku mit Ansible

Bereitstellung eines Docker-Images auf Dokku mit Ansible

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 tags 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 entfernen

Ich 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

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.beispiel

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster