Как правильно вести разработку php приложения в docker?

Есть приложение на php. Работу над ней ведут несколько разработчиков. Код лежит в gitlab репозитории. Сейчас у каждого разработчика есть своя виртуальная машина, там установлены nginx, postgres, php-fpm. Разработчики код заливают по sftp. Все это хорошо работает. Но микросервисов становится много и нужна какая-та автоматизация запуска приложения.

Сейчас хочется все перевести в docker. Мы собрали образ на основе php7-fpm. Нужно чтобы контейнер содержал код из мастер ветки и при мердже в эту ветку автоматом собирался. Это мы настроим через gitlab ci.

Вот у нас есть контейнер с кодом внутри, чтобы запустить нужно прописать конфиги в .env файле и запустить его с помощью docker-compose. Все работает.

Но как теперь разработчику вести разработку? Допустим он изменил файл index.php, как теперь измененный файл засунуть в docker контейнер? Тут я вижу 2 варианта:
  1. volume папка. Т.е. папка с кодом приложения шарится между хост машиной (хост машиной будет виртуалка разработчиков)
  2. Подключение по ssh к контейнеру и заливка по sftp


У первого пункта есть несколько недостатков:
  1. volume папка внутри контейнера создается от имени root. В код приложения должен и работает от имени обычного пользователя.
  2. Если эта папка есть в контейнера, то она удаляется и создается с нуля. Т.е. если расшарим папку с кодом, то код просто удалится


В ENTRYPOINT в Dockerfile можно засунуть bash скрипт файл в котором можно будет делать манипуляции с папками.

У второго пункта пока не знаю проблем.

Еще раз вопрос: как заливать изменения кода при разработке программисту в работающий контейнер?

Желательно решить вопрос так чтобы программист не парился с бильдингом docker.

Как решаете это Вы?
  • Вопрос задан
  • 4184 просмотра
Пригласить эксперта
Ответы на вопрос 5
index0h
@index0h
PHP, Golang. https://github.com/index0h
Разделите понятия DEV контейнер и PROD контейнер.
DEV образ не содержит в себе код вашего проекта, он содержит только окружение, а код маунтится через volume. Инженер делает правки у себя лакально, sftp не требуется.
PROD контейнер содержит в себе конкретную версию код со всем и зависимостями, он только запускается для работы в связке с DEV контейнерами.

Например у вас есть сервисы: sa, sb, sc.
В docker-compose.yml вы прописываете 6 сервисов: sa_dev, sa_prod, sb_dev, sb_prod, sc_dev, sc_prod.
Пары *_dev и *_prod живут на одинаковых ip с одинаковыми DNS алиасами, это нужно для того, что бы обеспечить жесткую связь между вашими сервисами и не перехреначивать половину docker-compose.yml

Например вы хотите сделать правки на sb, но sa и sc используются sb. Вы поднимаете:
sa_prod, sb_dev, sc_prod.
Делаете свои правки, проверяете. Когда все ок - коммитите правки и собираете новый образ sb_prod, пушите его в регистр и обновляете версию в docker-compose.yml
Ответ написан
Комментировать
LightAir
@LightAir
LA
Приходит новый разраб.
Ставит нужный софт (git, docker, docker-compose, шторм, composer и прочее).
Забирает данные с гита. В гите файлик docker-compose.yml с нужными настройками, в котором указано какие папки с хоста куда монтировать в composer.json секции scripts команды, типа 'd:build', 'd:start', в которых всё прописано для разворачивания и старта контейнеров.
Разработчик выполняет пару команд, типа 'composer run-script d:build && composer run-script d:start'.
Готово.
Дальше работает по оговоренному гитфлоу.

Тоже самое можно с Vagrant, не принципиально.
Ответ написан
@IgoNsk
backend web developer
Вот мой доклад на конференции на эту тему
https://2018.codefest.ru/lecture/1260/
Может быть будет что то полезно от туда.
Ответ написан
Комментировать
@abr_habr
Мы пошли по первому пути. Я просто переделал php-fpm образ, дописав в нём в docker-entrypoint создание пользователя, которому принадлежит монтируемая папка. Плюс сам php-fpm внутри контейнера теперь тоже запускается от этого пользователя.
Плюс этого подхода в том, что в кастомный образ я добавил xdebug, которого нет в оригинальной поставке.
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Ну так если у вас git, то пусть программист пушит в мастер, а докер образ забирает и пересобирается. Что пункт 1, что пункт 2 при наличии гита бред.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы