Как развернуть веб-приложение Laravel в Alpine Linux с помощью Docker? - PullRequest
3 голосов
/ 20 марта 2019

Я успешно развертываю веб-приложение Laravel на ECS, используя базовый образ из PHP, в частности 7.3-apache-stretch из https://hub.docker.com/_/php/

Хорошо зная о дискуссии о Alpine Linux Изображениях в Docker (предоставляя существенные сокращения в конечном измерении изображений), я хотел дать ему прогон, чтобы посмотреть, как он работает. К сожалению, хотя с CLI-версией это было очень легко (с использованием 7.3-cli-alpine3.9), не существует версии с поддержкой Apache. Что мне нужно, это Dockerfile, чтобы использовать в качестве основы для моих разработок.

Только Apache

Просматривая ТАК, я нашел Как мне запустить Apache 2 на Alpine в Docker? , который привлек мое внимание к https://github.com/nimmis/docker-alpine-apache,, который включает apache, но PHP полностью отсутствует, поэтому я бы должны интегрировать это.

Запуск Apache / NGINX и PHP с FCGI

Этот другой вопрос Альпийские варианты PHP и Apache / httpd в Docker сближают нас, но подразумевают использование двух контейнеров, это не то, что я хочу иметь.

Как должен Dockerfile позволить мне развернуть веб-приложение Laravel с полки?

1 Ответ

5 голосов
/ 20 марта 2019

После двух дней попыток я наконец достиг точки, в которой я могу развернуть свое приложение Laravel в контейнере apache с поддержкой php.Так как количество найденных проблем было бесчисленным, вот окончательный Dockerfile и объяснение разделов:

# PHP Images can be found at https://hub.docker.com/_/php/
FROM php:7.3-alpine3.9

# The application will be copied in /home/application and the original document root will be replaced in the apache configuration 
COPY . /home/application/ 

# Custom Document Root
ENV APACHE_DOCUMENT_ROOT /home/application/public

# Concatenated RUN commands
RUN apk add --update apache2 php7-apache2 php7-mbstring php7-session php7-json php7-pdo php7-openssl php7-tokenizer php7-pdo php7-pdo_mysql php7-xml php7-simplexml\
    && chmod -R 777 /home/application/storage \
    && chown -R www-data:www-data /home/application \
    && mkdir -p /run/apache2 \
    && sed -i '/LoadModule rewrite_module/s/^#//g' /etc/apache2/httpd.conf \
    && sed -i '/LoadModule session_module/s/^#//g' /etc/apache2/httpd.conf \
    && sed -ri -e 's!/var/www/localhost/htdocs!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/httpd.conf \
    && sed -i 's/AllowOverride\ None/AllowOverride\ All/g' /etc/apache2/httpd.conf \
    && docker-php-ext-install pdo_mysql \
    && rm  -rf /tmp/* /var/cache/apk/*

# Launch the httpd in foreground
CMD rm -rf /run/apache2/* || true && /usr/sbin/httpd -DFOREGROUND

Это краткий список операций, которые я сделал в Dockerfile

  1. Прежде всего, я все основываю на образе PHP, основанном на альпийском распространении.
  2. Я копирую весь свой исходный код Laravel на /home/application
  3. Iустановите для корня документа мою папку public Laravel
  4. Запросите установку пакетов операционной системы через apk (все они были необходимы для моего приложения Laravel).Полный список доступных пакетов можно найти на http://dl -cdn.alpinelinux.org / alpine / edge / community / x86_64 /
  5. Расширение разрешений для папки storage
  6. Изменить владельца всей папки /home/application/
  7. Включить все необходимые модули (могут потребоваться разные модули, в зависимости от приложения)
  8. Изменить корневой документ вhttpd.conf файл
  9. Включить инструкцию AllowOverride All
  10. Включить расширение pdo_mysql (в противном случае команды не смогут получить доступ к mysql)
  11. Очистить кэшсистема упаковки
  12. Запуск httpd

Используя эту Dockerfile, теперь можно запускать все веб-приложения Laravel, это будет просто копирование исходного кода приложениякод в /home/application/

...