Π”Π΅ΠΏΠ»ΠΎΠΉ Docker Image Π½Π° Dokku с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ansible

Π”Π΅ΠΏΠ»ΠΎΠΉ Docker Image Π½Π° Dokku с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ansible

ΠŸΡ€ΠΎΠ»ΠΎΠ³

НСдавно я ΡƒΠ·Π½Π°Π» ΠΎ "ΠΊΠ°Ρ€ΠΌΠ°Π½Π½ΠΎΠΌ" PaaS ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΌ Π½Π° Heroku с довольно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€” Dokku. ΠžΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ простого добавлСния сСртификата ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈ vhost ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, поэтому я Ρ€Π΅ΡˆΠΈΠ» пСрСнСсти свои docker ΠΎΠ±Ρ€Π°Π·Ρ‹ Π½Π° Dokku. ΠŸΡ€Π°Π²Π΄Π°, я Π±Ρ‹Π» Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Π°Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Dokku Π½Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Heroku

dokku container:push
dokku container:release
// ΠžΡ‡Π΅Π½ΡŒ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅Ρ‚ :(

БущСствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π° tags которая позволяСт Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹, Π½ΠΎ сам ΠΎΠ±Ρ€Π°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½Π° хостС Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π˜Π½Ρ‹ΠΌΠΈ словами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ сдСланный Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ image Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ сначала ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° хост.

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

Π― Π·Π½Π°ΠΊΠΎΠΌ с Ansible ΠΈ Π΄Π°ΠΆΠ΅ создавал с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простыС ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ‹ для доставки Π±Π΅ΠΊΠ΅Π½Π΄Π°, поэтому Π²Ρ‹Π±ΠΎΡ€ Π±Ρ‹Π» прост. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π·Π°ΠΏΠ°Ρ€ΠΈΡ‚ΡŒΡΡ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΊ dokku, Π½ΠΎ Π½Π΅Ρ‚, Π½Π΅ сСйчас.

Playbook

Π­Ρ‚ΠΎΡ‚ playbook Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° хост, восстанавливаСт ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ Π΅Π³ΠΎ Π² dokku. РазмСстил Π² Gitlab Ρ€Π΅ΠΏΠ΅. ВозмоТностСй для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π½ΠΎ.

push-image.dokku.yml

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