Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Собираем Docker-образы быстро и удобно с dapp

flant
March 21, 2017

Собираем Docker-образы быстро и удобно с dapp

Доклад технического директора компании «Флант» (http://flant.ru/) Дмитрия Столярова о сборке Docker-образов в контексте процессов CI/CD (Continuous Integration, Continuous Delivery и Continuous Deployment), то есть частой, быстрой и с минимальными дельтами. Представление утилиты dapp (https://github.com/flant/dapp) и её основных возможностей: стадии и кэш, внешний контекст, Git, артефакты, поддержка Chef.

* Текстовый обзор доклада: https://habrahabr.ru/company/flant/blog/324274/
* Видео с выступления: https://youtu.be/8R5UDg29Vic?t=12m45s

flant

March 21, 2017
Tweet

More Decks by flant

Other Decks in Technology

Transcript

  1. # whoami dmitry.stolyarov # hostname -d flant.ru # cat /etc/motd

    Собираем Docker-образы быстро и удобно Привет!
  2. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 jailer by flant 2009 LXC Docker 2013, осень Опыт
  3. Gentoo и Linux-VServer 2006 OpenSolaris Zones procfs v1 by flant

    2008 jailer by flant 2009 LXC Docker 2013, осень Docker 2014, 6 июня Опыт
  4. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики
  5. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  6. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  7. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops
  8. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend
  9. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend
  10. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend
  11. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ
  12. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ 10 КБ
  13. git проекта V2 PHP 7 git модуля для php nginx

    1.3 git модуля для nginx разработчики devops docker образ backend docker образ frontend < 200 МБ < 200 МБ 10 КБ +10 КБ
  14. разработчики devops docker образ backend docker образ frontend 10 сек.

    < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  15. разработчики devops docker образ backend docker образ frontend } 10

    сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  16. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  17. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  18. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  19. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты другие площадки 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ
  20. разработчики devops docker образ backend docker образ frontend }тестовая площадка

    production программисты другие площадки 10 сек. < 200 МБ < 200 МБ V2 PHP 7 nginx 1.3 git проекта git модуля для nginx git модуля для php 10 сек. 10 КБ +10 КБ архив
  21. Что должно быть в стандартной библиотеке? Все функции, которые могут

    понадобиться пользователям? Функции, которые могут понадобиться всем пользователям? или
  22. Почему не Dockerfile? #1: Everyone's problem is slightly different. Focus

    on the part that is the same for everyone, and solve that.
  23. Почему не Dockerfile? #2: Containers must be portable to the

    greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable. #1: Everyone's problem is slightly different. Focus on the part that is the same for everyone, and solve that.
  24. Почему не Dockerfile? #3: No is temporary, Yes is forever.

    If you're not sure about a new feature, say no. You can change your mind later. #2: Containers must be portable to the greatest possible number of machines. Be suspicious of any change which makes machines less interchangeable. #1: Everyone's problem is slightly different. Focus on the part that is the same for everyone, and solve that.
  25. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) $ gem install dapp
  26. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD $ gem install dapp
  27. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD gitlab + gitlab ci → kubernetes $ gem install dapp
  28. dapp github.com/flant/dapp Специализированная Workflow утилита для построения CI/CD Сейчас умеет

    только “собирать” (и складывать в Docker registry) Будет поддержка полного цикла CI/CD gitlab + gitlab ci → kubernetes github + travis → kubernetes $ gem install dapp
  29. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile
  30. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile Принципы проектирования
  31. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability Принципы проектирования
  32. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability — НЕТ! Принципы проектирования
  33. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability Принципы проектирования
  34. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security Принципы проектирования
  35. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security — НЕ ОЧЕНЬ! Принципы проектирования
  36. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security Принципы проектирования
  37. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security простота использования Принципы проектирования
  38. Ruby DSL (наверное перейдем на Yaml) dapp Конфигурация описывается в

    Dappfile Один репозиторий → Один проект → Один Dappfile portability security простота использования быстро и эффективно Принципы проектирования
  39. docker { from "ubuntu:16.04" } shell { install { run

    "apt-get update" run "apt-get install -y netcat" } }
  40. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  41. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  42. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04
  43. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo'
  44. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo' RUN apt-get update RUN apt-get install -y netcat
  45. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } } FROM ubuntu:16.04 CMD ncat -l 2000 -k -c 'xargs -n1 echo' RUN apt-get update RUN apt-get install -y netcat Зачем?
  46. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar RUN foo FROM ubuntu:16.04
  47. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  48. df19de45d436 1 МB 3f416119a68b 500 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  49. df19de45d436 1 МB d6d296481de2 978 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  50. df19de45d436 1 МB d6d296481de2 978 KB ubuntu:16.04 127 МB 67d10abe01cd

    750 KB RUN baz RUN bar bar RUN foo FROM ubuntu:16.04 af01be524a25 290 KB RUN qux
  51. 2. Чтобы пересборка не занимала лишнего места В какой последовательности

    собирать? 1. Чтобы собиралось быстро 3. Чтобы конечный образ был минимального размера?
  52. 2. Чтобы пересборка не занимала лишнего места В какой последовательности

    собирать? 1. Чтобы собиралось быстро 3. Чтобы конечный образ был минимального размера? паттерн!
  53. before_install install before_setup setup #2 Стадии и кэш dapp Тяжелое

    и редко изменяющееся <1% комитов
  54. before_install install before_setup setup #2 Стадии и кэш dapp “Прикладные

    зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  55. before_install install before_setup setup #2 Стадии и кэш dapp “Конфиги”

    ~2% комитов “Прикладные зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  56. before_install install before_setup setup #2 Стадии и кэш dapp “Конфиги”

    ~2% комитов “Прикладные зависимости” ~5% комитов Тяжелое и редко изменяющееся <1% комитов
  57. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  58. docker { from "ubuntu:16.04" cmd "ncat -l 2000 -k -c

    'xargs -n1 echo'" } shell { install { run "apt-get update" run "apt-get install -y netcat" } }
  59. shell { before_install { } install { run "apt-get update"

    run "apt-get install -y netcat" } }
  60. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat" } }
  61. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat" } }
  62. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" } }
  63. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" } }
  64. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } }
  65. shell { before_install { run "apt-get update" } install {

    run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } но...
  66. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } ubuntu:16.04 127 МB
  67. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB
  68. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB dac2ab8ac393 700 KB
  69. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } e4a86ad4bb95 40 МB ubuntu:16.04 127 МB dac2ab8ac393 700 KB А как в Dockerfile?
  70. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat
  71. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat ubuntu:16.04 127 МB
  72. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  73. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ab01fb5697de 40 МB ubuntu:16.04 127 МB
  74. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update RUN apt-get install \ -y netcat 2641b49c5f76 1 KB ab01fb5697de 40 МB 44fceb7383a8 200 KB ubuntu:16.04 127 МB
  75. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  76. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  77. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat && \ rm -rf /var/lib/apt 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  78. FROM ubuntu:16.04 CMD ncat -l 2000 -k \ -c 'xargs

    -n1 echo' RUN apt-get update && \ apt-get install \ -y netcat && \ rm -rf /var/lib/apt 21111bef7939 200 KB 2641b49c5f76 1 KB ubuntu:16.04 127 МB
  79. Конфликт Мы хотим иметь информацию (для следующих шагов или для

    следующих сборок) Мы НЕ хотим иметь её в конечном образе и НЕ хотим вручную очищать и думать об этом
  80. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } }
  81. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { }
  82. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir }
  83. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB
  84. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  85. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  86. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB
  87. docker.from "ubuntu:16:04" shell { before_install { run "apt-get update" }

    install { run "apt-get install -y netcat=1.10*" run "apt-get install -y tree" } } mount "/var/lib/apt" { from :build_dir } ubuntu:16.04 127 МB eee17ba66912 1 KB eee17ba66912 200 KB
  88. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер
  89. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер
  90. git docker образ dapp # dapp build #2 Внешний контекст

    Dappfile :build_dir :tmp_dir контейнер * Требуются для сборки
  91. dapp #2 Внешний контекст bundler, pip, composer, npm, bower apt,

    yum ccache, кэш “сборщика ассетов”
  92. Добавление “исходников” в образ — это то, что делается в

    каждом проекте и это должно быть удобно... ...очень удобно! И очень эффективно!
  93. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком?
  94. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком? 3. Как проставлять owner’а и права?
  95. #3 git dapp 2. При изменении каких файлов какие стадии

    пересобирать? 1. Добавлять все исходники каждый раз целиком? 3. Как проставлять owner’а и права? 4. Как “вырезать” кусочки из git’а?
  96. before_install before_setup setup #3 git dapp git archive install git

    git patch apply apt-get update php-fpm php-mysql composer
  97. before_install before_setup setup #3 git dapp install git apt-get update

    php-fpm php-mysql composer composer install git archive git patch apply
  98. before_install before_setup setup #3 git dapp install git apt-get update

    php-fpm php-mysql composer composer install git archive git patch apply
  99. before_install install before_setup setup #3 git dapp apt-get update php-fpm

    php-mysql composer composer install composer.lock git git archive git patch apply
  100. before_install install before_setup setup #3 git dapp apt-get update php-fpm

    php-mysql composer composer install composer.lock git git archive git patch apply
  101. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  102. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  103. before_install before_setup setup apt-get update php-fpm php-mysql composer git patch

    apply #3 git dapp git composer.lock install composer install git archive git patch apply
  104. git { add "/php_configs" { to "/etc/php" } add "/"

    { exclude "php_configs" to "/app" } }
  105. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" exclude "php_configs" to "/app" } }
  106. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" group "apache" exclude "php_configs" to "/app" } }
  107. git { add "/php_configs" { to "/etc/php" } add "/"

    { owner "apache" group "apache" exclude "php_configs" to "/app" } } install_depends_on "composer.lock"
  108. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp
  109. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp RUN apt-get purge build-essentials libmysql-dev
  110. FROM ubuntu:16.04 ADD . /src RUN apt-get build-essentials libmysql-dev RUN

    make -C src RUN cp /src/build/myapp /usr/bin/myapp RUN apt-get purge build-essentials libmysql-dev RUN apt-get install libmysql
  111. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) При

    сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы
  112. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) Меняются

    инструменты редко, ставятся долго, переустанавливать неудобно При сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы
  113. #4 Артефакты dapp Вес инструментов может быть большим (гигабайты!!!) Меняются

    инструменты редко, ставятся долго, переустанавливать неудобно При сборке проекта вам нужны какие-то инструменты, но они не нужны вам для работы *касается всего, что “компилируется”
  114. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src
  115. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src install artifact
  116. #4 Артефакты dapp before_install artifact_build git archive git patch apply

    apt-get install build-essentials libmysql-dev git make -C /src install artifact apt-get install libmysql
  117. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact apt-get install libmysql
  118. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  119. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  120. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  121. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  122. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  123. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql make -C /src
  124. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  125. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src install artifact конечный docker образ apt-get install libmysql apt-get install build-essentials libmysql-dev
  126. git #4 Артефакты dapp before_install artifact_build git archive git patch

    apply make -C /src apt-get install build-essentials libmysql-dev install artifact конечный docker образ apt-get install libmysql
  127. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" } }
  128. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } }
  129. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" }
  130. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { } }
  131. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" } }
  132. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } }
  133. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } } shell.install.run "apt-get install libmysql"
  134. docker.from "ubuntu:14.04" artifact { git.add "/" { to "/src" }

    shell { before_install.run "apt-get install build-essentials libmysql-dev" artifact_build.run "make -C /src" } artifact_depends_on "/" export "/src/build/myapp" { to "/usr/bin/myapp" after :install } } shell.install.run "apt-get install libmysql" docker.cmd "/usr/bin/myapp"
  135. bundler, composer, pip, npm, ... Модульность git project_1 Код git

    project_2 Код git nginx nginx v4 nginx v4 nginx v2 Dependency management
  136. bundler, composer, pip, npm, ... Модульность git project_1 Код git

    project_2 Код git nginx nginx v4 nginx v4 nginx v2 Dependency management
  137. Shell Модульность git project_1 Код git project_2 Код git nginx

    nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ...
  138. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ...
  139. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ... Chef
  140. Shell + git submodules Модульность Dependency management bundler, composer, pip,

    npm, ... Chef + Berkshelf git project_1 Код git project_2 Код git nginx nginx v4 nginx v4 nginx v2
  141. Shell + git submodules Модульность Dependency management bundler, composer, pip,

    npm, ... Chef + Berkshelf Puppet git project_1 Код git project_2 Код git nginx nginx v4 nginx v4 nginx v2
  142. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ... Chef + Berkshelf Puppet + Librarian
  143. Shell + git submodules Модульность git project_1 Код git project_2

    Код git nginx nginx v4 nginx v4 nginx v2 Dependency management bundler, composer, pip, npm, ... Chef + Berkshelf Puppet + Librarian
  144. #5 Chef dapp git # dapp build Dappfile /.dapp/chef/build/cookbooks .dapp_chef

    :build_dir /.dapp/deps/chefdk dappdeps/chefdk:0.17.3
  145. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks :build_dir
  146. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks :build_dir
  147. #5 Chef dapp git # dapp build Dappfile .dapp_chef /.dapp/deps/chefdk

    dappdeps/chefdk:0.17.3 /.dapp/deps/chefdk/bin/chef-solo /.dapp/chef/build/cookbooks конечный docker образ :build_dir
  148. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... git #5 Chef dapp
  149. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  150. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  151. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  152. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp
  153. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/
  154. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/
  155. before_install install before_setup setup .dapp_chef/ recipes/ before_install/ install/ ... templates/

    before_install/ install/ ... files/ before_install/ install/ ... /.dapp/chef/... recipes/ templates/ default/ files/ default/ git #5 Chef dapp /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/ /.dapp/chef/... recipes/ templates/ default/ files/ default/
  156. dimg_group { git.add "/" { to "/app" } dimg "backend"

    { } dimg "worker" { } } dimg "frontend" { }
  157. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    dimg "backend" { } dimg "worker" { } } dimg "frontend" { }
  158. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { } dimg "worker" { } } dimg "frontend" { }
  159. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { } } dimg "frontend" { }
  160. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { }
  161. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  162. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  163. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  164. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  165. chef.recipe "common" dimg_group { git.add "/" { to "/app" }

    chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" artifact_depends_on "/app/assets", "Gemfile*" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  166. docker.from "ubuntu:14.04" chef.recipe "common" dimg_group { git.add "/" { to

    "/app" } chef.module "rails", "~> 1.0" dimg "backend" { artifact { chef.module "rails_assets", "~> 1.0" artifact_depends_on "/app/assets", "Gemfile*" export "/app/public/assets" { after :setup } } chef { module "rails_backend", "~> 1.0"; recipe "backend" } } dimg "worker" { chef { module "rails_sidekiq", "~> 1.0"; recipe "worker" } } } dimg "frontend" { chef { module "nginx", "~> 1.0"; recipe "frontend" } }
  167. #1 Стадии и кэш #2 Внешний контекст #3 git #4

    Артефакты #5 Chef #6 Несколько образов dapp
  168. Мы хотим сделать dapp действительно крутым и полезным OpenSource решением

    Нам нужен ВАШ опыт использования Будем рады любой помощи Поставьте звёздочку ;) Обещаем очень быстро отвечать на все issue и очень быстро фиксить все баги. Для нас dapp это приоритетный проект. Если есть желание помочь с переводом документации на английский, или с её доработкой, да или вообще помочь — будем очень рады и ждем пулреквесты. Мы старались.
  169. Наши docker-проекты github.com/flant/dapp github.com/flant/docker_penetration_experiment github.com/flant/pam_docker github.com/flant/php_fpm_docker github.com/flant/superhosting github.com/flant/buildizer Дмитрий Столяров

    [email protected] linkedin.com/in/distol github.com/distol Всем спасибо! Тимофей Кириллов github.com/distorhead Алексей Игрычев github.com/alexey-igrychev