
ΠΡΠΎΠ»ΠΎΠ³
ΠΠ°ΡΠΊΠΎΡΠΎ Π½Π°ΡΡΠΈΡ Π·Π° "ΠΊΠ°ΡΠΌΠ°Π½Π΅Π½" PaaS, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° Heroku, Ρ Π΄ΠΎΡΡΠ° ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠΌΠ΅ β Dokku. ΠΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ ΠΏΡΠΈΠ²Π»Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° Π»Π΅ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΊΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ vhost ΠΎΡ ΠΊΡΡΠΈΡΡΠ°, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ Π΄Π° ΠΏΡΠ΅Π½Π΅ΡΠ° ΡΠ²ΠΎΠΈΡΠ΅ docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° Dokku. ΠΡΡΡΠ½ΠΎΡΡ, Π±ΡΡ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½, ΡΠ΅ Π² Dokku Π½ΡΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° Heroku.
dokku container:push
dokku container:release
// ΠΠΈ Π±ΠΈΠ»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° :(Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π΅ΠΏΠ»ΠΎΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΡΠ°ΠΌΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π²Π΅ΡΠ΅ Π½Π° Ρ ΠΎΡΡΠ° Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ. Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, Π·Π° Π΄Π° ΠΈΠ·ΠΊΠ°ΡΠ°ΡΠ΅ ΡΠΎΠΊΡ-ΡΠΎ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»Π΅Π½ image, first ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π½Π° Ρ ΠΎΡΡΠ°.
tags:create # ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΡΠ°Π³ ΠΊΡΠΌ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
tags:deploy # ΠΠ΅ΠΏΠ»ΠΎΠΉ Π½Π° ΡΠ°Π³Π½Π°ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
tags:destroy # ΠΡΠ΅ΠΌΠ°Ρ
Π½Π΅ΡΠ΅ ΡΠ°Π³ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎΠΠ°ΠΏΠΎΠ·Π½Π°Ρ ΡΡΠΌ Ρ Ansible ΠΈ Π΄Π°ΠΆΠ΅ ΡΡΠΌ ΡΡΠ·Π΄Π°Π²Π°Π» Ρ Π½Π΅Π³ΠΎΠ²Π° ΠΏΠΎΠΌΠΎΡ ΠΏΡΠΎΡΡΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΈ Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·Π±ΠΎΡΡΡ Π±Π΅ΡΠ΅ ΠΏΡΠΎΡΡ. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° dokku, Π½ΠΎ Π½Π΅, Π½Π΅ ΡΠ΅Π³Π°.
Playbook
Π’ΠΎΠ·ΠΈ playbook Π°ΡΡ ΠΈΠ²ΠΈΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠΏΠΈΡΠ° Π³ΠΎ Π½Π° Ρ ΠΎΡΡΠ°, Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π° Π² dokku. ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ Π΅ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π² Gitlab. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
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
ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ ansible Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΈ dokku Π½Π° Ρ ΠΎΡΡΠ° Π²Π΅ΡΠ΅ ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠ°ΠΊΠ°
ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"some_inventory
[dokku_hosts]
your.domain.exampleΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
