Stellen Sie Docker Image mit Ansible für Dokku bereit

Stellen Sie Docker Image mit Ansible für Dokku bereit

Prolog

Ich habe kürzlich von einem „Pocket“-PaaS erfahren, das Heroku ähnelt und einen ziemlich offensichtlichen Namen hat – Dokku. Die Möglichkeit, der Anwendung und dem Vhost sofort ein Zertifikat hinzuzufügen, hat mich sehr gereizt, also habe ich beschlossen, meine Docker-Images nach Dokku zu übertragen. Ich war zwar enttäuscht, dass Dokku keine ähnlichen Befehle wie Heroku hat

dokku container:push
dokku container:release
// Очень было бы удобно, но еще нет :(

Es gibt ein Team tags Dadurch können Sie Images bereitstellen, das Image selbst muss sich jedoch zu diesem Zeitpunkt bereits auf dem Host befinden. Mit anderen Worten: Um das gerade erstellte lokale Image auszurollen, müssen Sie es zunächst auf den Host kopieren.

tags:create <app> <tag>                        # Add tag to latest running app image
tags:deploy <app> <tag>                        # Deploy tagged app image
tags:destroy <app> <tag>                       # Remove app image tag

Da ich mit Ansible vertraut bin und sogar einfache Backend-Lieferpipelines erstellt habe, fiel mir die Wahl leicht. Natürlich könnte ich es satt haben und ein Plugin für Dokku schreiben, aber nein, jetzt nicht.

Playbook

Dieses Playbook archiviert ein lokales Image, kopiert es auf den Host, stellt es wieder her und stellt es auf Dokku bereit. Gepostet im Gitlab-Repo. Es gibt noch viel Raum für Verbesserungen.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "DEPLOY APP '{{ appname }}' TO 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: "Archive '{{ image }}' to upload"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Upload image '{{ image }}' to dokku at '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Upload result"
        debug:
          var: upload.dest

      - name: "Restore uploaded docker image"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Restore image"
        debug:
          var: restore.stdout_lines

      - name: "Retag image to '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Create dokku tag for '{{ dokku_image }}'"
        shell: 
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

      - name: "Release '{{ appname }}'"
        register: release
        shell: 
          cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"  

      - name: "Log - Release"
        debug:
          var: release.stdout_lines  

Es wird davon ausgegangen, dass Ansible bereits auf dem lokalen Computer und Dokku auf dem Host installiert ist

So verwenden

ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"

some_inventory

[dokku_hosts]
your.domain.example

Source: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz und VPS-VDS-Servern 🔥 Kaufen Sie zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster