Udrulning af Docker-billede på Dokku ved hjælp af Ansible

Udrulning af Docker-billede på Dokku ved hjælp af Ansible

Prolog

For nylig lærte jeg om en "pocket" PaaS, der ligner Heroku, med et ret direkte navn – Dokku. Jeg blev hurtigt tiltrukket af muligheden for nemt at tilføje et certifikat til app’en og vhost ud af boksen, så jeg besluttede mig for at overføre mine Docker-billeder til Dokku. Desværre blev jeg skuffet over, at der ikke findes kommandoer i Dokku som i Heroku.

dokku container:push
dokku container:release
// Det ville være meget praktisk, men det er der endnu ikke :(

Der findes en kommando tags der gør det muligt at deploye billeder, men selve billedet skal allerede være på hosten på dette tidspunkt. Med andre ord, for at udrulle et netop lavet lokalt billede, skal det først kopieres til hosten.

tags:create                          # Tilføj tag til seneste kørende app-billede
tags:deploy                          # Deploy tagged app-billede
tags:destroy                         # Fjern app-billedetag

Jeg er bekendt med Ansible og har endda lavet enkle pipelines til levering af backend med det, så valget var let. Man kunne selvfølgelig tage sig tid til at skrive et plugin til Dokku, men nej, ikke nu.

Playbook

Denne playbook arkiverer et lokalt billede, kopierer det til hosten, gendanner og deployer det i Dokku. Jeg har lagt det i en Gitlab-repo. Der er stadig masser af muligheder for forbedring.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "DEPLY APP '{{ appname }}' TIL 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: "Arkiver '{{ image }}' til upload"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Upload billede '{{ image }}' til dokku på '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

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

      - name: "Gendan uploadet docker-billede"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Gendan billede"
        debug:
          var: restore.stdout_lines

      - name: "Retagg billede til '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

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

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

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

Det forudsættes, at Ansible på den lokale maskine og Dokku på hosten allerede er installeret.

Brug sådan her

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

some_inventory

[dokku_hosts]
your.domain.example

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster