Nasazení Docker image na Dokku pomocí Ansible

Nasazení Docker image na Dokku pomocí Ansible

Prolog

Nedávno jsem se dozvěděl o "pocket" PaaS podobném Heroku s docela jasným názvem – Dokku. Velmi mě zaujala možnost snadného přidání certifikátu k aplikaci a vhostu přímo z krabice, a proto jsem se rozhodl přenést své docker obrazy na Dokku. Opravu mě ale zklamalo, že v Dokku nejsou žádné příkazy podobné Heroku.

dokku container:push
dokku container:release
// Bylo by to velmi pohodlné, ale zatím to není :(

Existuje příkaz tags který umožňuje nasazovat obrazy, ale obraz musí být v tu chvíli už na hostiteli. Jinými slovy, abychom nasadili právě vytvořený lokální image, je třeba ho nejprve zkopírovat na hostitele.

tags:create                          # Přidat tag k nejnovějšímu běžícímu obrazu aplikace
tags:deploy                          # Nasadit označený obraz aplikace
tags:destroy                         # Odstranit tag obrazu aplikace

Jsem obeznámen s Ansible a dokonce jsem s jeho pomocí vytvářel jednoduché pipeline pro dodávání backendu, takže výběr byl jednoduchý. Samozřejmě bych mohl napsat plugin k dokku, ale ne, ne teď.

Playbook

Tento playbook archivuje určitý lokální obraz, kopíruje ho na hostitele, obnovuje a nasazuje ho do dokku. Umístil jsem ho do repozitáře Gitlab. Možností pro zlepšení je ještě spousta.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "NASADIT APLIKACI '{{ appname }}' DO 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: "Archivovat '{{ image }}' pro nahrání"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Nahrát obraz '{{ image }}' do dokku na '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Výsledek nahrání"
        debug:
          var: upload.dest

      - name: "Obnovit nahraný docker obraz"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Obnova obrazu"
        debug:
          var: restore.stdout_lines

      - name: "Retetagovat obraz na '{{ dokku_image }}'"
        shell:
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Vytvořit dokku tag pro '{{ dokku_image }}'"
        shell:
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

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

      - name: "Log - Uvolnění"
        debug:
          var: release.stdout_lines  

Předpokládá se, že ansible je na lokálním počítači a dokku na hostiteli již nainstalováno.

Použít takto

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

some_inventory

[dokku_hosts]
vase.domena.priklad

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster