Distribuera Docker Image till Dokku med Ansible

Distribuera Docker Image till Dokku med Ansible

prolog

Jag lärde mig nyligen om en "pocket" PaaS liknande Heroku med ett ganska självklart namn - Dokku. Jag var väldigt attraherad av möjligheten att enkelt lägga till ett certifikat till applikationen och vhost ur lådan, så jag bestämde mig för att överföra mina docker-bilder till Dokku. Det är sant att jag blev besviken över att Dokku inte har kommandon som liknar Heroku

dokku container:push
dokku container:release
// Очень было бы удобно, но еще нет :(

Det finns ett lag tags som låter dig distribuera bilder, men själva bilden måste redan finnas på värden just nu. Med andra ord, för att kunna rulla ut den lokala bilden du just skapade måste du först kopiera den till värden.

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

Jag är bekant med Ansible och har till och med skapat enkla backend-leveranspipelines med den, så valet var enkelt. Visst kunde jag tröttna på det och skriva ett plugin för dokku, men nej, inte nu.

Playbook

Denna spelbok arkiverar en lokal bild, kopierar den till värden, återställer och distribuerar den till dokku. Postat i Gitlab repo. Det finns fortfarande gott om utrymme för förbättringar.

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  

det antas att ansible redan är installerat på den lokala maskinen och dokku på värden

Använd så här

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

någon_inventering

[dokku_hosts]
your.domain.example

Källa: will.com

Köp pålitlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster