Implantação de Imagem Docker no Dokku com Ansible

Implantação de Imagem Docker no Dokku com Ansible

Prólogo

Recentemente, descobri uma PaaS "compacta" semelhante ao Heroku, com um nome bem óbvio — Dokku. Fiquei muito atraído pela possibilidade de adicionar facilmente um certificado ao aplicativo e vhost de forma nativa, então decidi migrar minhas imagens docker para o Dokku. No entanto, fiquei desapontado ao perceber que o Dokku não tem comandos semelhantes ao Heroku.

dokku container:push
dokku container:release
// Seria muito conveniente, mas ainda não há :(

Existe um comando tags que permite implantar imagens, mas a própria imagem deve já estar no host nesse momento. Em outras palavras, para implantar uma imagem local recém-criada, é necessário copiá-la primeiro para o host.

tags:create                          # Adiciona tag à imagem mais recente em execução do aplicativo
tags:deploy                          # Implanta a imagem do aplicativo marcada
tags:destroy                         # Remove a tag da imagem do aplicativo

Estou familiarizado com Ansible e até criei pipelines simples para entrega de backend com ele, então a escolha foi simples. Claro, poderia me esforçar e escrever um plugin para o dokku, mas não, não agora.

Playbook

Este playbook arquiva uma imagem local, copia para o host, restaura e a implanta no dokku. Colocado no repositório Gitlab. Há muitas oportunidades de melhoria.

push-image.dokku.yml

push-image.dokku.yml

---
  - name: "IMPLANTAR APLICAÇÃO '{{ appname }}' NO 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: "Arquivar '{{ image }}' para upload"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Fazer upload da imagem '{{ image }}' para dokku em '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Log - Resultado do upload"
        debug:
          var: upload.dest

      - name: "Restaurar imagem docker carregada"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Log - Restaurar imagem"
        debug:
          var: restore.stdout_lines

      - name: "Retag imagem para '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Criar tag dokku para '{{ dokku_image }}'"
        shell: 
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

      - name: "Liberar '{{ appname }}'"
        register: release
        shell: 
          cmd: dokku tags:deploy "{{ appname }}" "{{ apptag }}"  

      - name: "Log - Liberação"
        debug:
          var: release.stdout_lines  

presume-se que o ansible na máquina local e o dokku no host já estejam instalados

Usar assim

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

some_inventory

[dokku_hosts]
your.domain.example

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster