php dockerfile安装依赖详解

在php中,镜像系统变体有两种,一种是 Debian , 另一种是 Alpine 。两者存在一定的区别。在实际使用的时候,需要根据具体的情况来选择。

然而,在linux的世界里,有个很关键的知识点,那就是用户。www-data 是 Linux 系统中专门给 web 服务(比如 Nginx、Apache)用的用户,不同 Linux 发行版对这个用户的默认配置不同(注:这个id,就跟我们在数据库里用户id , 是一样的意思)。

bash 复制代码
#执行下面的语句,就能获取到当前系统的默认用户id
id www-data
# alpine 是 82
# Debian/ubuntu 是 33

Debian/Ubuntu 系统:默认变体(标签不带alpine,比如php:8.2-fpm),体积大但兼容性好;(www-data 的默认 UID 是 33)
Alpine 系统:轻量变体(标签带alpine,比如php:8.2-fpm-alpine3.20),体积小但依赖少。(www-data 的默认 UID 是 82)

文章目录

Alpine 系统

Alpine 系统,它是需要带 alpine 标签的。比如说 php:8.2-fpm-alpine3.20,也就是说,使用哪个版本的php,就在哪个版本后面加上 alpine , 之后再加上 Alpine 的版本号。

版本号查找

1、登录 【https://xuanyuan.cloud/r/library/php/tags?tag=8.4-fpm-alpine】 【library/php】,如下图所示

2、在搜索框中,搜索对应的版本,如 【8.4-fpm-alpine】,然后,就会出来对应的版本。在这儿选择自己所需要的版本即可。

阿里源的配对

在选定 alpine 的版本后,对应的阿里源地址也要对应。不然,下载依赖的时候会报错,找不到安装包。

1、登陆 【https://developer.aliyun.com/mirror/alpine】,如下图所示,之后点击 "下载地址"

2、进入下载地址后,可以看到有很多个版本。【注意,选择的版本需要跟 最初选定的版本一致,也就是说,要下依赖,必须在这儿得有的版本才行】,在代码中的配置如下

bash 复制代码
#需要哪个版本,就把 3.20 这个换成期他的就行,比如说要 3.18 的 
#echo "https://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories; \
echo "https://mirrors.aliyun.com/alpine/v3.20/main/" > /etc/apk/repositories; \
echo "https://mirrors.aliyun.com/alpine/v3.20/community/" >> /etc/apk/repositories; \
整个dockerfile的代码如下
bash 复制代码
    # 阶段 1:安装依赖(含 Redis/Swoole 扩展)
    FROM php:8.4-fpm-alpine3.23
    WORKDIR /var/www/html


    # 核心修复:修改 www-data 用户的 UID/GID 为宿主机的 1000(关键!)
    RUN sed -i 's/^www-data:x:82:82:/www-data:x:1000:1000:/' /etc/passwd \
        && sed -i 's/^www-data:x:82:/www-data:x:1000:/' /etc/group


    RUN echo "https://mirrors.aliyun.com/alpine/v3.23/main/" > /etc/apk/repositories; \
        echo "https://mirrors.aliyun.com/alpine/v3.23/community/" >> /etc/apk/repositories; \
        apk update --no-cache; \
        apk add --no-cache \
                redis-dev \
                gcc g++ make autoconf musl-dev php-dev \
                sqlite-dev libzip-dev zip unzip git; \
        docker-php-ext-install pdo pdo_mysql pdo_sqlite zip; \
        # 清理编译工具和缓存(扩展安装完成后再删)
        apk del gcc g++ make autoconf musl-dev php-dev; \
        rm -rf /tmp/pear /var/cache/apk/*;


    # 安装 Composer + 配置阿里云国内源
    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
        && php composer-setup.php --install-dir=/usr/bin --filename=composer \
        && rm composer-setup.php \
        # 赋予 Composer 执行权限,避免权限不足
        && chmod +x /usr/bin/composer \
        # 先更新 Composer 到最新版,解决版本兼容问题
        && composer self-update --stable \
        && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/;


    # 提前创建目录并配置权限(此时 UID 已改为 1000)
    RUN mkdir -p /var/www/html/storage /var/www/html/bootstrap/cache \
        && chown -R www-data:www-data /var/www/html \
        && chmod -R 755 /var/www/html;

    # 优化:先复制 composer 配置(缓存依赖,加速构建)
    COPY composer.json composer.lock* ./


    RUN composer install \
        --no-dev \
        --optimize-autoloader \
        --no-interaction \
        --no-scripts \
        --prefer-dist \
        --ignore-platform-reqs || \
        # 容错:如果 composer 安装失败,尝试更新 composer 再装(同样移除无效参数)
        (composer self-update && composer install --no-dev --optimize-autoloader --no-interaction --no-scripts --prefer-dist --ignore-platform-reqs);

    # 复制 Laravel 源码
    COPY .. .

    # 最终权限确认(无需切换 root,因为前面已改 www-data 的 UID 为 1000)
    RUN chmod -R 775 /var/www/html/storage \
        && chmod -R 775 /var/www/html/bootstrap/cache

    USER www-data

    # 启动 PHP-FPM
    CMD ["php-fpm"]

Debian 版本

配置技巧

1、先来一个表格,更能讲明白

2、配置规则

bash 复制代码
deb {镜像站域名}/debian/ {版本代号} {软件组件}
#例子
#阿里云 Debian 12(bookworm)的核心源
deb https://mirrors.aliyun.com/debian/ bookworm main non-free non-free-firmware contrib

#拼清华 Debian 11(bullseye)的安全更新源
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bullseye-security main

#拼中科大 Debian 12 的更新源
deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main non-free non-free-firmware contrib
代码配置(适配Debian 12 bookworm)
bash 复制代码
# 适配所有Debian版本的sed替换, 但前提是镜像版本是 FROM php:8.2-fpm
RUN if [ -f /etc/apt/sources.list.d/debian.sources ]; then \
        sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources; \
    else \
        sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list; \
    fi \
    && apt update --no-cache;
相关推荐
ZHOUPUYU1 小时前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t6 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
冬奇Lab6 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
ceclar1237 小时前
C++使用format
开发语言·c++·算法
码说AI7 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子7 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗7 小时前
初识C++
开发语言·c++