
Prolog
For nylig lærte jeg om en "pocket" PaaS, der ligner Heroku, med et ret direkte navn – Dokku. Jeg blev hurtigt tiltrukket af muligheden for nemt at tilføje et certifikat til app’en og vhost ud af boksen, så jeg besluttede mig for at overføre mine Docker-billeder til Dokku. Desværre blev jeg skuffet over, at der ikke findes kommandoer i Dokku som i Heroku.
dokku container:push
dokku container:release
// Det ville være meget praktisk, men det er der endnu ikke :(Der findes en kommando der gør det muligt at deploye billeder, men selve billedet skal allerede være på hosten på dette tidspunkt. Med andre ord, for at udrulle et netop lavet lokalt billede, skal det først kopieres til hosten.
tags:create # Tilføj tag til seneste kørende app-billede
tags:deploy # Deploy tagged app-billede
tags:destroy # Fjern app-billedetagJeg er bekendt med Ansible og har endda lavet enkle pipelines til levering af backend med det, så valget var let. Man kunne selvfølgelig tage sig tid til at skrive et plugin til Dokku, men nej, ikke nu.
Playbook
Denne playbook arkiverer et lokalt billede, kopierer det til hosten, gendanner og deployer det i Dokku. Jeg har lagt det i en Gitlab-repo. Der er stadig masser af muligheder for forbedring.
push-image.dokku.yml
---
- name: "DEPLY APP '{{ appname }}' TIL 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: "Arkiver '{{ image }}' til upload"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o "./{{ tarname }}" {{ image }}
- name: "Upload billede '{{ image }}' til dokku på '{{ inventory_hostname }}'"
register: upload
copy:
src: "./{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Log - Upload resultat"
debug:
var: upload.dest
- name: "Gendan uploadet docker-billede"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Log - Gendan billede"
debug:
var: restore.stdout_lines
- name: "Retagg billede til '{{ dokku_image }}'"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Opret dokku tag for '{{ dokku_image }}'"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "Udrul '{{ appname }}'"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Log - Udrulning"
debug:
var: release.stdout_lines
Det forudsættes, at Ansible på den lokale maskine og Dokku på hosten allerede er installeret.
Brug sådan her
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleKilde: habr.com
