centos/php-72-centos7PHP 7.2容器镜像是一个基于Source-to-Image(S2I)的基础镜像,用于构建和运行PHP 7.2应用程序。用户可以选择基于RHEL或CentOS的构建器镜像:
生成的镜像可使用podman或docker运行(本文档中所有podman命令均可替换为docker命令,参数保持不变)。
假设使用ubi8/php-72镜像,在OpenShift中可通过php:72镜像流标签访问。
构建示例cakephp应用:
bashoc new-app php:7.2~[***]
访问应用:
bashoc get pods oc exec <pod名称> -- curl 127.0.0.1:8080
或直接访问:
bashcurl 127.0.0.1:8080
该镜像支持OpenShift的Source-to-Image(S2I)策略,这是一个将应用源代码作为输入,使用构建器镜像生成可运行应用镜像的框架。
构建器镜像包含以下重要脚本:
/usr/libexec/s2i/assemble: 用于生成包含应用程序工件的新镜像,将应用源代码放置到镜像中的适当目录/usr/libexec/s2i/run: 作为生成的容器镜像的默认命令,启动启用PHP支持的httpd服务与Source-to-Image策略相比,使用Dockerfile是构建包含应用程序的PHP容器镜像的更灵活方式,适用于S2I不够灵活或在OpenShift环境外构建镜像的场景。
bashpodman pull ubi8/php-72
UBI镜像
ubi8/php-72可在UBI最终用户许可协议(EULA)条款下自由使用和重新分发。
以cakephp示例应用为例:
bashgit clone [***] app-src
此步骤通常包括:将应用源代码放入容器、安装依赖项、设置生成镜像的默认命令。有两种方法可实现:
3.1 使用自定义设置
创建以下Dockerfile:
dockerfileFROM ubi8/php-72 # 添加应用源代码 ADD app-src . # 安装依赖 RUN TEMPFILE=$(mktemp) && \ curl -o "$TEMPFILE" "[***]" && \ php <"$TEMPFILE" && \ ./composer.phar install --no-interaction --no-ansi --optimize-autoloader # 运行脚本使用标准方式配置PHP应用并最终执行httpd -D FOREGROUND CMD /usr/libexec/s2i/run
3.2 使用Source-to-Image脚本
创建以下Dockerfile:
dockerfileFROM ubi8/php-72 # 将应用源代码添加到assemble脚本期望的目录并设置权限 USER 0 ADD app-src /tmp/src RUN chown -R 1001:0 /tmp/src USER 1001 # 安装依赖 RUN /usr/libexec/s2i/assemble # 设置生成镜像的默认命令 CMD /usr/libexec/s2i/run
bashpodman build -t cakephp-app .
bashpodman run -d cakephp-app
可在源代码仓库中的.s2i/environment文件中设置键值对形式的环境变量。
以下环境变量设置php.ini文件中的相应属性值:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
| ERROR_REPORTING | 配置PHP错误、警告和通知的报告级别 | E_ALL & ~E_NOTICE |
| DISPLAY_ERRORS | 控制PHP是否输出错误、通知和警告 | ON |
| DISPLAY_STARTUP_ERRORS | 控制PHP启动序列期间发生的错误是否单独处理 | OFF |
| TRACK_ERRORS | 是否将最后一个错误/警告消息存储在$php_errormsg中 | OFF |
| HTML_ERRORS | 是否将错误链接到相关文档 | ON |
| INCLUDE_PATH | PHP源代码文件路径 | .:/opt/app-root/src:/opt/rh/rh-php72/root/usr/share/pear (EL7) .:/opt/app-root/src:/usr/share/pear (EL8, Fedora) |
| PHP_MEMORY_LIMIT | 内存限制 | 128M |
| SESSION_NAME | 会话名称 | PHPSESSID |
| SESSION_HANDLER | 会话保存方法 | files |
| SESSION_PATH | 会话数据文件位置 | /tmp/sessions |
| SESSION_COOKIE_DOMAIN | Cookie有效的域 | 空 |
| SESSION_COOKIE_HTTPONLY | 是否为Cookie添加httpOnly标志 | 0 |
| SESSION_COOKIE_SECURE | 是否仅通过安全连接发送Cookie | Off |
| SHORT_OPEN_TAG | PHP是否识别标签之间的代码 | OFF |
| DOCUMENTROOT | 应用程序的DocumentRoot路径 | / |
以下环境变量设置opcache.ini文件中的相应属性值:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
| OPCACHE_MEMORY_CONSUMPTION | OPcache共享内存存储大小(MB) | 128 |
| OPCACHE_REVALIDATE_FREQ | 检查脚本时间戳更新的频率(秒) | 2 |
| OPCACHE_MAX_FILES | OPcache哈希表中的最大键(脚本)数 | 4000 |
| 环境变量 | 描述 |
|---|---|
| PHPRC | 设置php.ini文件的路径 |
| PHP_INI_SCAN_DIR | 扫描其他ini配置文件的路径 |
可覆盖Apache MPM prefork设置以提高PHP应用性能:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
| HTTPD_START_SERVERS | 启动时创建的子服务器进程数 | 8 |
| HTTPD_MAX_REQUEST_WORKERS | 同时服务的请求数限制 | 256(通过公式自动调整:总内存/15MB) |
| 环境变量 | 描述 |
|---|---|
| COMPOSER_MIRROR | 自定义composer仓库镜像URL |
| COMPOSER_INSTALLER | 覆盖默认Composer下载URL |
| COMPOSER_ARGS | 添加额外的composer install命令行参数 |
现有PHP项目仓库无需修改,但以下文件会影响构建过程:
需通过composer安装的依赖项列表,格式文档见Composer架构。
如果应用程序的DocumentRoot嵌套在源代码目录/opt/app-root/src中,用户可以提供自己的Apache .htaccess文件,用于覆盖Apache行为并指定如何处理应用程序请求。该文件需要位于应用程序源代码的根目录。
要立即获取应用源代码中的更改,需使用OPCACHE_REVALIDATE_FREQ=0环境变量运行构建的镜像:
bashpodman run -e OPCACHE_REVALIDATE_FREQ=0 -p 8080:8080 php-app
要在运行中的容器中更改源代码,使用Podman的exec命令:
bashpodman exec -it <容器ID> /bin/bash
执行后,当前目录将设置为源代码所在的/opt/app-root/src目录。
不仅可以扩展镜像内容,还可以使用source-to-image扩展镜像的启动脚本和配置。应用程序结构如下:
| 文件夹名称 | 描述 |
|---|---|
./httpd-cfg | 可包含其他Apache配置文件(*.conf) |
./httpd-ssl | 可包含自己的SSL证书(在certs/子目录)和密钥(在private/子目录) |
./php-pre-start | 可包含在httpd启动前执行的shell脚本(*.sh) |
./php-post-assemble | 可包含在assemble脚本结束时执行的shell脚本(*.sh) |
./ | 应用程序源代码 |
bash# 基本运行 docker run -d -p 8080:8080 --name php-app ubi8/php-72 # 带环境变量配置 docker run -d -p 8080:8080 \ -e PHP_MEMORY_LIMIT=256M \ -e OPCACHE_REVALIDATE_FREQ=0 \ --name php-app ubi8/php-72 # 挂载本地代码目录进行开发 docker run -d -p 8080:8080 \ -v ./my-php-app:/opt/app-root/src \ -e OPCACHE_REVALIDATE_FREQ=0 \ --name php-dev-app ubi8/php-72
yamlversion: '3' services: php-app: image: ubi8/php-72 ports: - "8080:8080" environment: - PHP_MEMORY_LIMIT=256M - ERROR_REPORTING=E_ALL - DISPLAY_ERRORS=ON - OPCACHE_REVALIDATE_FREQ=0 volumes: - ./my-php-app:/opt/app-root/src restart: unless-stopped
-p 8080:8080参数会将容器端口8080映射到主机的相同端口,确保仅在必要时暴露端口DISPLAY_ERRORS=OFF以避免敏感信息泄露SESSION_COOKIE_SECURE=On和SESSION_COOKIE_HTTPONLY=1增强会话安全性Dockerfile和其他源代码可在[***]
DockerfileDockerfile.rhel7Dockerfile.rhel8Dockerfile.fedoramanifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务