在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 系统)
- [Debian 版本](#Debian 版本)
-
- 配置技巧
- [代码配置(适配Debian 12 bookworm)](#代码配置(适配Debian 12 bookworm))
-
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;