Deploy Docker Image op Dokku met Ansible

Deploy Docker Image op Dokku met Ansible

Proloog

Onlangs ontdekte ik een 'pocket' PaaS, vergelijkbaar met Heroku, met een vrij voor de hand liggende naam - Dokku. Ik was zeer aangetrokken door de mogelijkheid om eenvoudig een certificaat aan een toepassing en vhost toe te voegen, dus besloot ik mijn Docker-images naar Dokku te verplaatsen. Helaas was ik teleurgesteld dat Dokku geen commando's heeft zoals Heroku.

dokku container:push
dokku container:release
// Het zou erg handig zijn, maar het is er nog niet :(

Er is een commando tags dat het mogelijk maakt om images te deployen, maar de image moet op dat moment al op de host aanwezig zijn. Met andere woorden, om een net gemaakte lokale image uit te rollen, moet je deze eerst naar de host kopiƫren.

tags:create                          # Voeg een tag toe aan de nieuwste draaiende app-image
tags:deploy                          # Deploy de getagde app-image
tags:destroy                         # Verwijder de app-image tag

Ik ben bekend met Ansible en heb zelfs met behulp daarvan eenvoudige pipelines voor de levering van de backend gemaakt, dus de keuze was eenvoudig. Natuurlijk zou ik een plugin voor dokku kunnen schrijven, maar niet nu.

Playbook

Dit playbook archiveert een bepaalde lokale image, kopieert deze naar de host, herstelt en deployt deze in dokku. Ik heb het in een Gitlab-repo geplaatst. Er zijn nog veel mogelijkheden voor verbetering.

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 }}"

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

ervan uitgaande dat Ansible op de lokale machine en dokku op de host al zijn geĆÆnstalleerd

Zo gebruiken

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

some_inventory

[dokku_hosts]
your.domain.example

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster