Найти тему
Default Web development

Docker контейнер для разработки на symfony

Хотите создать удобную среду для разработки на symfony, но не знаете как? Тогда эта статья для Вас.

Установка docker подробно описана на официальном сайте.

Предположим, что нам понадобится обработка изображений и работа с мультиязычными сайтами. Во время сборки доставим все необходимые пакеты. Как БД будет использована mariadb.

Создадим где-нибудь папку app. Для примера, это будет /home/user/app. В корне создадим папку docker, внутри нее папку php. В ней создадим папку files и положим туда файл php-local.ini следующего содержания:

date.timezone = "Asia/Krasnoyarsk"

Если этого не сделать, то в контейнере будет установлена таймзона по-умолчанию. Может привести к неприятным последствиям сохранения дат в бд.

Создаем DockerFile следующего содержания:

https://pastebin.com/6DYFU64e - ссылка на скачивание файла текстом.

Рассмотрим значение каждой из строк в отдельности.

FROM php:7.4-cli

Сборку проводим на основе официального php 7.4 образа, cli версия.

COPY --from=composer /usr/bin/composer /usr/bin/composer

Подтянем в контейнер composer последней версии из официального образа.

COPY files/php-local.ini "$PHP_INI_DIR/conf.d/php-local.ini"

Скопируем наши настройки тайм-зоны в целевой образ

RUN \
mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" && \
apt-get update && \
apt-get install -y \
git unzip wget libpng-dev libfreetype6-dev libjpeg62-turbo-dev libicu-dev && \
docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-configure intl && \
docker-php-ext-install mysqli pdo_mysql gd intl && \

Установим правильный php.ini из офф. образа, поставим все необходимые пакеты, включим расширения php для работы с бд, картинками и переводами.

#> symfony
wget https://get.symfony.com/cli/installer -O - | bash && \
mv /root/.symfony/bin/symfony /usr/local/bin/symfony && \
#< symfony

Установим Symfony CLI

adduser --uid 1000 --gecos '' --disabled-password myuser && \

По умолчанию, контейнер работает под 33 пользователем. Если оставить, как есть, нельзя будет редактировать файлы вне контейнера. Добавим нашего пользователя внутрь контейнера. 1000 - uid пользователя linux. У Вас может отличаться.

apt-get remove -y wget && \
apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/*

Подчистим за собой установочный мусор. Этим уменьшаем финальный размер образа.

USER myuser

Контейнер запускается от имени пользователя myuser.

WORKDIR /home/myuser/app

Установка рабочей директории для нашего приложения.

CMD ["symfony", "server:start", "--no-tls", "--port=8000"]

По умолчанию, запускаем symfony server при старте контейнера.

Теперь, когда DockerFile полностью сформирован, запускаем сборку.

docker build . -t symfony-app

Важно! Запуск команды производим из папки /home/user/app/docker/php. Иначе не соберется.

Дожидаемся окончания сборки и получаем готовый образ.

docker images | grep symfony-app

Убеждаемся в наличии образа в списке наших образов.

Теперь необходимо развернуть стартовый шаблон приложения.

docker run -it --rm -v /home/user/app:/home/myuser/app symfony-app bash

Отдельное внимание надо обратить на строчку -v. Пробрасываем папку с корнем нашего приложения внутрь контейнера.

Выполняем команду и создаем приложение, как указано на странице официальной документации

composer create-project symfony/website-skeleton:"5.2.x@dev" app

После установки пишем exit и завершаем таким образом работу с этим контейнером.

Установка произошла в папку /home/user/app/app.

Теперь все готово к запуску нашего приложения.

docker run -it --rm -p 9001:8000 -v /home/user/app/app:/home/myuser/app symfony-app

Здесь стоит обратить внимание на строчку -p 9001:8000 - мы пробросили наш локальный порт 9001 на контейнерный 8000. Теперь достаточно открыть в браузере https://127.0.0.1:9001 и увидеть стандартную главную страницу нашего symfony приложения. Если в Вашей системе порт 9001 уже занят - попробуйте любой другой.

Вот и все. Контейнер готов к работе.