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