如何使用 Docker 在 Alpine Linux 上部署 Laravel Web 应用程序?

How to deploy a Laravel Web Application on Alpine Linux using Docker?

我正在使用 PHP 中的基础映像在 ECS 上成功部署 Laravel Web 应用程序,特别是 https://hub.docker.com/_/php/

中的 7.3-apache-stretch

很清楚 Docker 中关于 Alpine Linux 图像的讨论(允许显着减少最终图像尺寸),我想给它一个 运行,看看如何它执行。不幸的是,虽然使用 CLI 版本非常容易(使用 7.3-cli-alpine3.9),但没有启用 apache 的版本。我需要的是 Dockerfile 作为我开发的基础。

仅限 Apache

浏览 SO,我发现 How do I run Apache 2 on Alpine in Docker? that brought my attention to https://github.com/nimmis/docker-alpine-apache,它启用了 apache,但是 PHP 完全不见了,所以我必须整合它。

运行 Apache/NGINX 和 PHP 与 FCGI

另一个问题 让我们更接近,但暗示使用两个容器,这不是我想要的。

Dockerfile 应该如何让我部署现成的 Laravel Web 应用程序?

经过两天的尝试,我终于到达了可以在启用 php 的 apache 容器上部署我的 Laravel 应用程序的地步。由于发现的问题数不胜数,这里是最后的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. 我将文档根目录设置为我的 public Laravel 文件夹
  4. 通过 apk 请求安装操作系统包(所有这些都是我的 Laravel 应用程序所必需的)。可以在 http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/
  5. 上找到可用软件包的完整列表
  6. 扩展 storage 文件夹的权限
  7. 更改整个 /home/application/ 文件夹的所有者
  8. 启用所有需要的模块(可能需要不同的模块,具体取决于应用程序)
  9. 更改 httpd.conf 文件中的文档根目录
  10. 启用AllowOverride All指令
  11. 启用pdo_mysql扩展(否则命令将无法访问mysql)
  12. 清理打包系统的缓存
  13. 运行 httpd

使用此 Dockerfile,现在可以 运行 所有 Laravel Web 应用程序,只需将应用程序源代码复制到 /home/application/