Пролог
Недавно я узнал о "карманном" 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
--- - 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/
Добавить комментарий