Деплой Docker Image на Dokku с помощью Ansible

от автора

image

Пролог

Недавно я узнал о "карманном" PaaS похожем на Heroku с довольно очевидным названием — Dokku. Очень привлекла возможность простого добавления сертификата к приложению и vhost из коробки, поэтому я решил перенести свои docker образы на Dokku. Правда, я был разочарован тем, что в Dokku нет команд подобных Heroku

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

Существует команда tags которая позволяет деплоить образы, но сам образ должен быть уже на хосте в этот момент. Иными словами, чтобы выкатить только что сделанный локальный image его нужно сначала скопировать на хост.

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

Я знаком с Ansible и даже создавал с его помощью простые пайплайны для доставки бекенда, поэтому выбор был прост. Можно было бы конечно запариться и написать плагин к dokku, но нет, не сейчас.

Playbook

Этот playbook архивирует некий локальный образ, копирует на хост, восстанавливает и деплоит его в dokku. Разместил в Gitlab репе. Возможностей для улучшения еще полно.

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   

предполагается что ansible на локальной машине и dokku на хосте уже установлены
Использовать так

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

some_inventory

[dokku_hosts] your.domain.example

ссылка на оригинал статьи https://habr.com/ru/post/504236/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *