
prolog
Jeg har for nylig lært om en "lomme" PaaS, der ligner Heroku med et ret åbenlyst navn - Dokku. Jeg var meget tiltrukket af evnen til nemt at tilføje et certifikat til applikationen og vhost ud af kassen, så jeg besluttede at overføre mine docker-billeder til Dokku. Sandt nok var jeg skuffet over, at Dokku ikke har kommandoer, der ligner Heroku
dokku container:push
dokku container:release
// Очень было бы удобно, но еще нет :(
Der er et hold som giver dig mulighed for at implementere billeder, men selve billedet skal allerede være på værten i dette øjeblik. Med andre ord, for at udrulle det lokale billede, du lige har lavet, skal du først kopiere det til værten.
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
Jeg er bekendt med Ansible og har endda lavet simple backend-leveringspipelines med det, så valget var nemt. Selvfølgelig kunne jeg godt blive træt af det og skrive et plugin til dokku, men nej, ikke nu.
Playbook
Denne afspilningsbog arkiverer et lokalt billede, kopierer det til værten, gendanner og implementerer det til dokku. Udgivet i Gitlab repo. Der er stadig masser af plads til forbedringer.
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
det antages, at ansible allerede er installeret på den lokale maskine og dokku på værten
Brug sådan her
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"
noget_inventar
[dokku_hosts]
your.domain.example
Kilde: www.habr.com
