
Prolog
Niedawno odkryłem "pocket" PaaS podobny do Heroku o dość oczywistej nazwie — Dokku. Bardzo zachwyciła mnie możliwość łatwego dodawania certyfikatu do aplikacji i vhostu z pudełka, dlatego postanowiłem przenieść swoje obrazy dockera na Dokku. Niestety, byłem rozczarowany, że w Dokku brakuje poleceń podobnych do Heroku.
dokku container:push
dokku container:release
// Byłoby to bardzo wygodne, ale jeszcze tego nie ma :(Istnieje polecenie które pozwala na wdrażanie obrazów, ale sam obraz musi być już w tym momencie na hoście. Innymi słowy, aby wypuścić właśnie zrobiony lokalny obraz, najpierw trzeba go skopiować na hosta.
tags:create # Dodaj tag do ostatniego uruchomionego obrazu aplikacji
tags:deploy # Wdróż oznaczony obraz aplikacji
tags:destroy # Usuń tag obrazu aplikacjiZnam się na Ansible i nawet tworzyłem za jego pomocą proste rurociągi do dostarczania backendu, więc wybór był prosty. Oczywiście można by było napisać wtyczkę do dokku, ale nie, nie teraz.
Playbook
Ten playbook archiwizuje pewien lokalny obraz, kopiuje na hosta, przywraca i wdraża go w dokku. Umieściłem go w repozytorium Gitlab. Jest jeszcze wiele możliwości do poprawy.
push-image.dokku.yml
---
- name: "WDRAŻAJ APLIKACJĘ '{{ appname }}' DO 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: "Archiwizuj '{{ image }}' do przesyłania"
register: env
delegate_to: localhost
shell:
cmd: docker image save -o ".\/{{ tarname }}" {{ image }}
- name: "Prześlij obraz '{{ image }}' do dokku na '{{ inventory_hostname }}'"
register: upload
copy:
src: ".\/{{ tarname }}"
dest: "{{ upload_path }}"
- name: "Log - Wynik przesyłania"
debug:
var: upload.dest
- name: "Przywróć przesłany obraz dockera"
register: restore
shell:
cmd: docker image load -i "{{ upload_path }}"
- name: "Log - Przywróć obraz"
debug:
var: restore.stdout_lines
- name: "Oznacz obraz jako '{{ dokku_image }}'"
shell:
cmd: docker tag "{{ image }}" "{{ dokku_image }}"
- name: "Utwórz tag dokku dla '{{ dokku_image }}'"
shell:
cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"
- name: "Wydaj '{{ appname }}'"
register: release
shell:
cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"
- name: "Log - Wydanie"
debug:
var: release.stdout_lines
zakłada się, że ansible jest już zainstalowany na lokalnej maszynie i dokku na hoście
Użyj w ten sposób
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleŹródło: habr.com
