Depolari i Docker Image në Dokku me ndihmën e Ansible

Depolari i Docker Image në Dokku me ndihmën e Ansible

Prologu

Më së fundi, mësova për një PaaS "xhaxha" të ngjashëm me Heroku me një emër mjaft të qartë - Dokku. Më tërheqi shumë mundësia për të shtuar lehtësisht certifikatën në aplikacion dhe vhost nga kuti, prandaj vendosa të transferoj imazhet e mia docker në Dokku. Megjithatë, isha i zhgënjyer se Dokku nuk ka komanda si Heroku.

dokku container:push
dokku container:release
// Do të ishte shumë e dobishme, por akoma nuk ka :(

Ekziston një komandë tags që lejon deploy-n e imazheve, por vetë imazhi duhet të jetë tashmë në host në atë moment. Në fjalë të tjera, për të përdorur imazhin lokal të sapo kthyer, duhet së pari ta kopjoni në host.

tags:create                          # Shto tag në imazhin më të fundit të aplikacionit
tags:deploy                          # Deploy imazhin e tag-uar të aplikacionit
tags:destroy                         # Hiqe tag-un e imazhit të aplikacionit

Jam i njohur me Ansible dhe madje kam krijuar me ndihmën e tij pipeline të thjeshta për dërgimin e backend-it, prandaj zgjedhja ishte e lehtë. Në fakt, mund të isha munduar dhe të shkruaja një plugin për dokku, por jo, jo tani.

Playbook

Ky playbook arkivon një imazh lokal, e kopjon në host, e rikthen dhe e deploy-n në dokku. E kam vendosur në repo Gitlab. Ka ende shumë mundësi për përmirësim.

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  

është supozuar se ansible duhet të jetë instaluar në makinën lokale dhe dokku në host

Përdoreni kështu

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

some_inventory

[dokku_hosts]
your.domain.example

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster