Distribuera Docker Image till Dokku med hjÀlp av Ansible

Distribuera Docker Image till Dokku med hjÀlp av Ansible

Prolog

Jag fick nyligen veta om en "pocket" PaaS liknande Heroku med ett rĂ€tt uppenbart namn — Dokku. Jag blev verkligen intresserad av möjligheten att enkelt lĂ€gga till ett certifikat till appen och vhost direkt, sĂ„ jag bestĂ€mde mig för att flytta mina dockerbilder till Dokku. TyvĂ€rr blev jag besviken över att Dokku saknar kommandon liknande Heroku.

dokku container:push
dokku container:release
// Det skulle vara vÀldigt praktiskt, men det finns Ànnu inte :(

Det finns ett kommando tags som tillÄter distribution av bilder, men sjÀlva bilden mÄste redan vara pÄ vÀrden vid det tillfÀllet. Med andra ord, för att lansera en nygjord lokal bild mÄste den först kopieras till vÀrden.

tags:create                          # LÀgg till tagg till den senaste körande appbilden
tags:deploy                          # Distribuera taggad appbild
tags:destroy                         # Ta bort tagg för appbild

Jag Àr bekant med Ansible och har till och med skapat enkla pipelines för att leverera backend med den, sÄ valet var enkelt. Jag hade sjÀlvklart kunnat göra en plugin till dokku, men nej, inte nu.

Playbook

Den hÀr playbooken arkiverar en lokal bild, kopierar den till vÀrden, ÄterstÀller den och distribuerar den i dokku. Jag har lagt den i ett Gitlab-repo. Det finns fortfarande gott om möjligheter för förbÀttring.

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: "Arkivera '{{ image }}' för uppladdning"
        register: env
        delegate_to: localhost
        shell: 
          cmd: docker image save -o "./{{ tarname }}" {{ image }}

      - name: "Ladda upp bild '{{ image }}' till dokku pÄ '{{ inventory_hostname }}'"
        register: upload
        copy:
          src: "./{{ tarname }}"
          dest: "{{ upload_path }}"

      - name: "Logg - Uppladdningsresultat"
        debug:
          var: upload.dest

      - name: "ÅterstĂ€ll uppladdad dockerbild"
        register: restore
        shell:
          cmd: docker image load -i "{{ upload_path }}"

      - name: "Logg - ÅterstĂ€ll bild"
        debug:
          var: restore.stdout_lines

      - name: "Retag bilden till '{{ dokku_image }}'"
        shell: 
          cmd: docker tag "{{ image }}" "{{ dokku_image }}"

      - name: "Skapa dokku-tag för '{{ dokku_image }}'"
        shell: 
          cmd: dokku tags:create "{{ appname }}" "{{ apptag }}"

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

      - name: "Logg - SlÀpp"
        debug:
          var: release.stdout_lines  

Det förutsÀtts att ansible redan Àr installerat pÄ den lokala maskinen och dokku pÄ vÀrden.

AnvÀnd pÄ detta sÀtt

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

some_inventory

[dokku_hosts]
your.domain.example

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster