dapp — утилита для сборки и деплоя контейнеров. Особенности работы
Содержание

dapp — утилита от российской компании Флант, которая занимается внедрением devops-практик (kubernetes, ci/cd и всё такое, ну вы в курсе) Подробное описание можно прочитать на Хабре, а я бы хотел остановиться на некоторых особенностях работы с ней при сборке образов (здесь и далее под образом подразумевается docker image)

На момент написания статьи актуальная версия dapp 0.36.*

В качестве примера для наглядности и понимания общей картины возьмём за основу немного урезанное содержимое dappfile.yaml из официальной документации

dimg: ~
from: ubuntu:16.04
docker:
  WORKDIR: /app
git:
- add: /
  to: /app
  stageDependencies:
    install:
    - "*"
ansible:
  beforeInstall:
  - name: "Install additional packages"
    apt:
      name: "{{`{{ item }}`}}"
      state: present
      update_cache: yes
    with_items:
      - locales
      - ca-certificates
  - name: Add repository key
    apt_key:
      keyserver: keyserver.ubuntu.com
      id: E5267A6C
  - name: "Add PHP apt repository"
    apt_repository:
      repo: 'deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main'
      update_cache: yes
  - name: "Install PHP and modules"
    apt:
      name: "{{`{{ item }}`}}"
      state: present
      update_cache: yes
    with_items:
      - php7.2
      - php-sqlite3
      - php-xml
      - php-zip
      - php-mbstring
      - php-intl
  - name: Install composer
    get_url:
      url: https://getcomposer.org/download/1.6.5/composer.phar
      dest: /usr/local/bin/composer
      mode: a+x
  install:
  - name: "Install app deps"
    # NOTICE: Always use `composer install` command in real world environment!
    shell: composer update
    become: yes
    become_user: app
    args:
      creates: /app/vendor/
      chdir: /app/
  setup:
  - name: "Create start script"
    copy:
      content: |
        #!/bin/bash
        php bin/console server:run 0.0.0.0:8000        
      dest: /app/start.sh
  • Если в dappfile.yaml описан только один образ, мы можем использовать тильду ~ для обозначения образа по-умолчанию
dimg: ~
  • Если мы хотим указать в качестве зависимостей этапа сборки (stageDependencies) все файлы, которые добавляются в образ, используем астериск в кавычках "*"
git:
- add: /
  to: /app
  stageDependencies:
    install:
    - "*"
  • При указании stageDependencies пути должны быть указаны относительные (относительно указанного в - add:)
git:
- add: /
  to: /app
  stageDependencies:
    install:
    - composer.json
  • Добавление файлов в образ командой git происходит между этапами beforeInstall и install, поэтому stageDependencies нет смысла задавать для beforeInstall, к тому же такая попытка приведёт к ошибке

  • Для директивы git можно указывать несколько - add: со своими stageDependencies для работы с разными каталогами

git:
- add: /src
  to: /app
  stageDependencies:
    install:
    - "*"
- add: /assets
  to: /assets
  stageDependencies:
    install:
    - "style.css"
  • Для использования ansible переменных конструкцию с названием переменной и двойными фигурными скобками {{ }} надо дополнительно заключать в гравис, заключая уже это в ещё одни фигурные скобки с двойными кавычками — вспоминаем, что dapp написан на ruby
ansible:
  beforeInstall:
  - name: "Install additional packages"
    apt:
      name: "{{`{{ item }}`}}"
      state: present
      update_cache: yes
  • Чтобы с помощью ansible скопировать содержимое какого-либо файла в файл в образе, можно использовать функцию .Files.Get. Пути указываем относительно местоположение самого dappfile.yaml. Не забываем использовать indent, чтобы получить правильные отступы в yaml-файле, иначе получим ошибку
ansible:
  - copy:
      content: |
{{ .Files.Get "files/nginx/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf

Также за дополнительными полезностями в работе с dapp можно обратиться к официальному FAQ