Bereitstellung des Docker-Images auf Dokku mit Ansible

Bereitstellung des Docker-Images auf Dokku mit Ansible

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

Ich 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

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

Quelle: habr.com

60GB SSD 8Gb DDR4