Composer离线模式必须显式设COMPOSER_DISABLE_NETWORK=1且全局禁用repo.packagist,否则install必报Could not fetch packages.json;vendor存在仍失败是因默认校验远程元数据,无法跳过,须配合--no-plugins --no-scripts --no-autoloader及dump-autoload -o。

隔离内网中 Composer 无法自动进入离线模式,必须显式切断所有网络触发点,否则 composer install 一定会报 Could not fetch https://repo.packagist.org/packages.json ——这不是网络不通的问题,而是 Composer 默认行为没被覆盖。
COMPOSER_DISABLE_NETWORK=1 是硬开关,不设它就白搭
这个环境变量是离线执行的强制前提,不是可选项。它影响所有命令(包括 install、update、require),一旦未设置,哪怕加了 --no-network(该参数根本不存在)或断掉网卡,Composer 仍会尝试发起 DNS 查询和 HTTP 请求。
-
ENV COMPOSER_DISABLE_NETWORK=1必须写进 Dockerfile 或宿主机 shell profile,不能只在运行时临时 export - 如果用
docker run -e COMPOSER_DISABLE_NETWORK=1,要确认容器内 PHP 进程能继承该变量(某些 alpine 镜像需用sh -c包裹) - 设了但不起作用?检查是否被项目级
composer.json中的"repositories"覆盖——比如写了{"type": "packagist", "url": false},会导致直接退出而非静默忽略
repo.packagist false 必须全局配置,不能靠 --no-plugins 绕过
composer config --global repo.packagist false 是第二道防线。它让 Composer 彻底放弃访问 Packagist 元数据,避免 fallback 到默认源。仅靠 --no-plugins 或 --no-scripts 拦不住元数据校验环节。
- 在构建镜像时执行:RUN composer config --global repo.packagist false
- 验证是否生效:容器内运行
composer config --list | grep repo.packagist,输出应为repo.packagist false - 若项目
composer.json里有"repositories"块,且其中包含"type": "composer"的远程地址,必须删掉或注释掉,否则会优先使用该源并尝试联网
cache-files-dir 必须显式指定,且路径末尾带 /files
离线复用 ZIP 包只依赖 cache-files-dir,不是 cache-dir。后者只是父目录,不控制 ZIP 存放位置;没配 cache-files-dir,Composer 就回退到默认 ~/.composer/cache/files,而离线机上该路径通常为空。
- 在线机准备阶段:先
composer config --global --unset cache-dir,再composer config --global cache-files-dir /opt/composer-cache/files(注意结尾/files) - 必须触发完整下载:
composer install --prefer-dist --no-dev --no-autoloader --no-scripts,确保所有 ZIP 写入/opt/composer-cache/files/下对应子路径 - 离线机上复制整个
/opt/composer-cache/files目录(保留层级),再运行composer config --global cache-files-dir /your/copied/path/files - 常见失败:目录权限不对(如 www-data 用户无法读取)、路径少写
/files、或挂载为只读导致 stat() 失败,结果静默 fallback 到重下
vendor 目录存在也不代表能跳过 install 步骤
即使 vendor/ 已存在且完整,composer install 仍会校验 composer.lock 中每个包的版本合法性与来源一致性。若 lock 文件里有 "source" 类型条目(如 Git URL、dev-master),离线时无法校验,必然失败。
- 离线部署唯一安全路径:在联网机用
composer install --no-dev --prefer-dist --no-scripts --no-plugins --optimize-autoloader生成 vendor/ 和锁文件,整体拷贝过去 - 离线机执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader(必须带这组参数) - 执行完立刻补:
composer dump-autoload -o,否则运行时大概率报Class not found - 别用
composer create-project:它强制联网解析模板元信息,COMPOSER_DISABLE_NETWORK=1对它无效
最容易被忽略的是:以为 composer --version 成功就等于离线可用。真正要验证的是 composer install 是否全程没发任何网络请求——得在断网状态下跑完整流程,再查 strace -e trace=connect,sendto php /usr/local/bin/composer install ... 确认无系统调用发生。











