
Prolog
Jag fick nyligen veta om en "pocket" PaaS liknande Heroku med ett rĂ€tt uppenbart namn â Dokku. Jag blev verkligen intresserad av möjligheten att enkelt lĂ€gga till ett certifikat till appen och vhost direkt, sĂ„ jag bestĂ€mde mig för att flytta mina dockerbilder till Dokku. TyvĂ€rr blev jag besviken över att Dokku saknar kommandon liknande Heroku.
dokku container:push
dokku container:release
// Det skulle vara vÀldigt praktiskt, men det finns Ànnu inte :(Det finns ett kommando som tillÄter distribution av bilder, men sjÀlva bilden mÄste redan vara pÄ vÀrden vid det tillfÀllet. Med andra ord, för att lansera en nygjord lokal bild mÄste den först kopieras till vÀrden.
tags:create # LÀgg till tagg till den senaste körande appbilden
tags:deploy # Distribuera taggad appbild
tags:destroy # Ta bort tagg för appbildJag Àr bekant med Ansible och har till och med skapat enkla pipelines för att leverera backend med den, sÄ valet var enkelt. Jag hade sjÀlvklart kunnat göra en plugin till dokku, men nej, inte nu.
Playbook
Den hÀr playbooken arkiverar en lokal bild, kopierar den till vÀrden, ÄterstÀller den och distribuerar den i dokku. Jag har lagt den i ett Gitlab-repo. Det finns fortfarande gott om möjligheter för förbÀttring.
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: "Arkivera '{{ image }}' för uppladdning"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o "./{{ tarname }}" {{ image }}
- name: "Ladda upp bild '{{ image }}' till dokku pÄ '{{ inventory_hostname }}'"
register: upload
copy:
src: "./{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Logg - Uppladdningsresultat"
debug:
var: upload.dest
- name: "Ă
terstÀll uppladdad dockerbild"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Logg - Ă
terstÀll bild"
debug:
var: restore.stdout_lines
- name: "Retag bilden till '{{ dokku_image }}'"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Skapa dokku-tag för '{{ dokku_image }}'"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "SlÀpp '{{ appname }}'"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Logg - SlÀpp"
debug:
var: release.stdout_lines
Det förutsÀtts att ansible redan Àr installerat pÄ den lokala maskinen och dokku pÄ vÀrden.
AnvÀnd pÄ detta sÀtt
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleKĂ€lla: habr.com
