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;
相关推荐
Kapaseker3 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴3 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭13 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab14 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
ServBay19 小时前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
BoomHe19 小时前
Now in Android 架构模式全面分析
android·android jetpack
用户962377954481 天前
CTF 伪协议
php
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin