НОВОСТИ Деплой Docker Image на Dokku с помощью Ansible

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
fshpgpmnrptvl-lyxypvmmkwb9a.jpeg


Пролог



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


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


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


tags:create # Add tag to latest running app image
tags:deploy # Deploy tagged app image
tags:destroy # 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=DOCKER_IMAGE"


some_inventory


[dokku_hosts]
your.domain.example
 
Сверху Снизу