发布于2026-07-07 阅读(0)
扫一扫,手机访问
先看一个Docker镜像瘦身时经常踩的坑:在Alpine里装Composer。很多人图省事,直接在最终镜像里装Composer,结果发现镜像胖了一大圈——这其实不是Composer本人的问题,而是它背后的依赖工具在悄悄“增重”。

直接在最终镜像中装Composer,几乎必然导致体积失控。原因很简单:Composer本身并不大,但它依赖的git、unzip、curl等工具,会连带把musl libc动态链接库、BusyBox的冗余二进制、全部APK缓存一起拖进来。更让人头疼的是,composer install生成的vendor/目录里,还混着.git目录、测试文件、文档等用不上的东西。默认情况下,这些冗余内容可不会被自动清理掉。
解决这个问题的标准姿势,就是多阶段构建。你需要在builder阶段负责安装和编译,final阶段只负责上线运行——两者的分工要彻底分开。
git unzip curl → 下载composer.phar → 运行composer install --no-dev --optimize-autoloader --classmap-authoritative。基础镜像可以用php:8.2-cli-alpine,因为CLI工具链完整。php:8.2-fpm-alpine,精简掉CLI。只需要COPY --from=builder /app/vendor ./vendor,composer.json和composer.lock都不需要复制进来,更不用再跑任何composer命令。rm -rf /root/.composer /tmp/* /var/cache/apk/*。不过,这句话生效的前提是,apk add已经带上了--no-cache。apk add默认会把包索引和下载的.apk文件写进/var/cache/apk/。问题是,这个目录一旦出现在镜像的某一层,就永远计入体积——哪怕下一层用rm -rf删掉也不管用。验证方法很简单:构建完成后,跑docker run --rm your-image ls -la /var/cache/apk/,输出应该为空。
apk add必须带--no-cache,比如apk add --no-cache git unzip curl。apk add --update-cache,这会主动写入缓存。需要临时源时,用--repository。RUN --mount=type=cache,id=apk-cache,dest=/var/cache/apk,但多数场景下--no-cache更稳当。检验瘦身是否到位,直接检查最终容器里有没有以下任意一项就行:
/usr/local/bin/composer 或 /usr/bin/composer/root/.composer 目录vendor/bin/ 下除了phpunit以外的其他可执行文件(比如doctrine、phpcs)vendor/*/tests/、vendor/*/docs/、vendor/*/CHANGELOG.md真正干净的生产镜像,只应该包含vendor/autoload.php、vendor/composer/(里面有autoload_*.php)以及实际用到的扩展类文件。其他所有东西,都是多余的干扰项。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8