Wdrażanie obrazu Docker na Dokku za pomocą Ansible

Wdrażanie obrazu Docker na Dokku za pomocą Ansible

Prolog

Niedawno odkryłem "pocket" PaaS podobny do Heroku o dość oczywistej nazwie — Dokku. Bardzo zachwyciła mnie możliwość łatwego dodawania certyfikatu do aplikacji i vhostu z pudełka, dlatego postanowiłem przenieść swoje obrazy dockera na Dokku. Niestety, byłem rozczarowany, że w Dokku brakuje poleceń podobnych do Heroku.

dokku container:push
dokku container:release
// Byłoby to bardzo wygodne, ale jeszcze tego nie ma :(

Istnieje polecenie tags które pozwala na wdrażanie obrazów, ale sam obraz musi być już w tym momencie na hoście. Innymi słowy, aby wypuścić właśnie zrobiony lokalny obraz, najpierw trzeba go skopiować na hosta.

tags:create                          # Dodaj tag do ostatniego uruchomionego obrazu aplikacji
tags:deploy                          # Wdróż oznaczony obraz aplikacji
tags:destroy                         # Usuń tag obrazu aplikacji

Znam się na Ansible i nawet tworzyłem za jego pomocą proste rurociągi do dostarczania backendu, więc wybór był prosty. Oczywiście można by było napisać wtyczkę do dokku, ale nie, nie teraz.

Playbook

Ten playbook archiwizuje pewien lokalny obraz, kopiuje na hosta, przywraca i wdraża go w dokku. Umieściłem go w repozytorium Gitlab. Jest jeszcze wiele możliwości do poprawy.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "WDRAŻAJ APLIKACJĘ '{{ 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: "Archiwizuj '{{ image }}' do przesyłania"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o ".\/{{ tarname }}" {{ image }}

      - name: "Prześlij obraz '{{ image }}' do dokku na '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: ".\/{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Wynik przesyłania"
        debug:
          var: upload.dest

      - name: "Przywróć przesłany obraz dockera"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Przywróć obraz"
        debug:
          var: restore.stdout_lines

      - name: "Oznacz obraz jako '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Utwórz tag dokku dla '{{ dokku_image }}'"
        shell: 
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

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

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

zakłada się, że ansible jest już zainstalowany na lokalnej maszynie i dokku na hoście

Użyj w ten sposób

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

some_inventory

[dokku_hosts]
your.domain.example

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster