2024-07 更新了Amazon Linux 2023操作系统Apache+PHP8的模版
一、背景
1、启动脚本问题
构建容器用于AWS ECS服务和AWS EKS服务的时候,由于容器服务的启动endpoint只能是唯一的启动进程,而且必须处于前台,因此会面临无法同时启动php-fpm和httpd的问题。为了解决这个问题,可增加一个启动服务脚本,然后让容器调用这个单一脚本。
启动脚本src目录下的run_apache.sh内容如下:
mkdir -p /var/run/apache2
mkdir -p /var/lock/apache2
/usr/sbin/php-fpm -D
/usr/sbin/httpd -D FOREGROUND
2、镜像安装包过多体积过大问题
此外,在构建容器中,还经常遇到体积过大,影响服务发布速度等问题。可通过优化分成解决。以上配置中,将安装软件的所有命令写在同一行,可实现一个文件层,由此可显著减少容器的体积。此外,在安装软件时候,执行 yum update -y 可将补丁升级到最新,减少安全风险。
如下配置文件可参考构建容器镜像用于AWS ECS服务和AWS EKS服务。中国区和海外区测试通过。
二、在Amazon Linux 2上构建PHP 7.4容器镜像构建
兼容CentOS7的Amazon Linux 2系统,因为CentOS 7自带的PHP是5.x版本过于低,因此采用Amazon Linux 2提供的amazon-linux-extra软件包内的7.x版本来构建环境。
下文构建Apache + PHP7.4环境的配置,以下为Dockerfile主文件内容:
FROM public.ecr.aws/amazonlinux/amazonlinux:2
# Install apache/php
RUN yum install -y which curl httpd mysql htop net-tools gd procps-ng iputils bind-utils vim nc awscli \
&& amazon-linux-extras install -y php7.4 \
&& yum install -y php-gd php-pecl-imagick php-mbstring php-xml php-xmlrpc && yum update -y \
&& yum clean all
# Install configuration file
ADD src/httpd.conf /etc/httpd/conf/
ADD src/run_apache.sh /root/
# Configure apache
RUN chown -R apache:apache /var/www && chmod +x /root/run_apache.sh
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
# starting script for php-fpm and httpd
CMD ["/bin/bash", "-c", "/root/run_apache.sh"]
由此即可发起构建。
三、在Amazon Linux 2023上构建PHP 8.1容器镜像构建
兼容CentOS9的Amazon Linux 2023系统,其默认的PHP版本已经来到了8.x,因此就不需要在额外找高版本的PHP8软件包了。
如下构建Apache + PHP8.1环境的配置,以下为Dockerfile主文件内容:
FROM public.ecr.aws/amazonlinux/amazonlinux:2023
# Install dependencies
RUN yum install -y \
httpd \
php \
&& ln -s /usr/sbin/httpd /usr/sbin/apache2
# Install app
ADD src/run_apache.sh /root/
RUN echo "<?php phpinfo(); ?>" > /var/www/html/index.php \
&& mkdir /run/php-fpm/ \
&& chown -R apache:apache /var/www \
&& chmod +x /root/run_apache.sh
# Configure apache
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
# starting script for php-fpm and httpd
CMD ["/bin/bash", "-c", "/root/run_apache.sh"]
由此即可发起构建。
四、发起镜像构建
由此可按照这篇文章构建容器镜像,然后上传到AWS ECR,即可用于ECS和EKS容器服务。