Deploy Docker Image pe Dokku folosind Ansible

Deploy Docker Image pe Dokku folosind Ansible

Prolog

Recent am aflat despre un PaaS "pocket" similar cu Heroku, cu un nume destul de evident - Dokku. M-a atras foarte mult posibilitatea de a adăuga simplu un certificat aplicației și vhost direct din cutie, așa că am decis să îmi mut imaginile Docker pe Dokku. Totuși, am fost dezamăgit că în Dokku nu sunt comenzi asemănătoare celor de la Heroku.

dokku container:push
dokku container:release
// Ar fi fost foarte convenabil, dar încă nu există :(

Există o comandă tags care permite implementarea imaginilor, dar imaginea trebuie să fie deja pe host în acel moment. Cu alte cuvinte, pentru a lansa o imagine locală proaspăt creată, trebuie să o copiezi mai întâi pe host.

tags:create                          # Adaugă etichetă la ultima imagine de aplicație rulată
tags:deploy                          # Implementați imaginea de aplicație etichetată
tags:destroy                         # Elimină eticheta imaginii aplicației

Sunt familiarizat cu Ansible și chiar am creat cu ajutorul său procese simple pentru livrarea backend-ului, așa că alegerea a fost ușoară. Bineînțeles, aș fi putut complica lucrurile și să scriu un plugin pentru dokku, dar nu, nu acum.

Playbook

Acest playbook arhivează o anumită imagine locală, o copiază pe host, o restaurează și o implementează în dokku. Am publicat-o în repo-ul Gitlab. Există încă multe oportunități de îmbunătățire.

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 }}' for 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  

se presupune că ansible pe mașina locală și dokku pe host sunt deja instalate

Utilizați așa

ansible-playbook push-image.dokku.yml -i some_inventory -e "appname=DOKKU_APP_NAME image=DOCKER_IMAGE"

some_inventory

[dokku_hosts]
your.domain.example

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster