
Proloog
Onlangs ontdekte ik een 'pocket' PaaS, vergelijkbaar met Heroku, met een vrij voor de hand liggende naam - Dokku. Ik was zeer aangetrokken door de mogelijkheid om eenvoudig een certificaat aan een toepassing en vhost toe te voegen, dus besloot ik mijn Docker-images naar Dokku te verplaatsen. Helaas was ik teleurgesteld dat Dokku geen commando's heeft zoals Heroku.
dokku container:push
dokku container:release
// Het zou erg handig zijn, maar het is er nog niet :(Er is een commando dat het mogelijk maakt om images te deployen, maar de image moet op dat moment al op de host aanwezig zijn. Met andere woorden, om een net gemaakte lokale image uit te rollen, moet je deze eerst naar de host kopiƫren.
tags:create # Voeg een tag toe aan de nieuwste draaiende app-image
tags:deploy # Deploy de getagde app-image
tags:destroy # Verwijder de app-image tagIk ben bekend met Ansible en heb zelfs met behulp daarvan eenvoudige pipelines voor de levering van de backend gemaakt, dus de keuze was eenvoudig. Natuurlijk zou ik een plugin voor dokku kunnen schrijven, maar niet nu.
Playbook
Dit playbook archiveert een bepaalde lokale image, kopieert deze naar de host, herstelt en deployt deze in dokku. Ik heb het in een Gitlab-repo geplaatst. Er zijn nog veel mogelijkheden voor verbetering.
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 }}"
taken.
- 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
ervan uitgaande dat Ansible op de lokale machine en dokku op de host al zijn geĆÆnstalleerd
Zo gebruiken
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleBron: habr.com
