
Преамбула
Наскоро научих за "портативната" PaaS, подобна на Heroku, с доста очевидното име – Dokku. Много ми хареса възможността за лесно добавяне на сертификат към приложението и vhost от самото начало, затова реших да преместя своите Docker образи на Dokku. Обаче бях разочарован, че в Dokku няма команди, подобни на тези в Heroku.
dokku container:push
dokku container:release
// Беше много удобно, но все още го няма :(Съществува команда която позволява деплой на образи, но самият образ трябва да бъде вече на хоста в този момент. С други думи, за да изтеглите току-що направения локален image, първо трябва да го копирате на хоста.
tags:create # Добавя таг към последния работещ образ на приложението
tags:deploy # Деплоира тагнатия образ на приложението
tags:destroy # Премахва тага на образа на приложениетоЗапознат съм с Ansible и дори съм създавал с негова помощ прости пайплайни за доставка на бекенд, така че изборът беше лесен. Можеше разбира се да напиша плъгин за dokku, но не, не сега.
Playbook
Този playbook архивира определен локален образ, копира го на хоста, възстановява го и го деплоирa в 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: "Архивиране на '{{ image }}' за качване"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o "./{{ tarname }}" {{ image }}
- name: "Качване на образ '{{ image }}' в dokku на '{{ inventory_hostname }}'"
register: upload
copy:
src: "./{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Лог - Резултат от качването"
debug:
var: upload.dest
- name: "Възстановяване на качения Docker образ"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Лог - Възстановяване на образа"
debug:
var: restore.stdout_lines
- name: "Преобозначаване на образа на '{{ dokku_image }}'"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Създаване на dokku таг за '{{ dokku_image }}'"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "Публикуване на '{{ appname }}'"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Лог - Публикуване"
debug:
var: release.stdout_lines
Предполага се, че Ansible на локалната машина и dokku на хоста вече са инсталирани.
Използвайте така
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleИзточник: habr.com
