docker pull默认不检查远程更新,会缓存旧镜像;部署前须显式执行docker pull --platform linux/amd64 dunglas/frankenphp:latest,并用digest锁定镜像以避免浮动标签导致的abi不兼容问题。

docker pull 时没加 --pull=always 会缓存旧镜像
FrankenPHP 官方镜像(如 dunglas/frankenphp)每天可能有多个构建,但 docker run 或 docker-compose up 默认不会检查远程是否有新版本——它只看本地有没有同名标签。如果你之前拉过 :latest,哪怕官方已更新,本地仍用旧二进制。
实操要点:
- 部署前必须显式触发拉取:
docker pull --platform linux/amd64 dunglas/frankenphp:latest(注意补全--platform,避免误拉 macOS/Windows 镜像) - 在 CI/CD 脚本中禁用缓存:
docker build --pull --no-cache -t myapp .,其中--pull强制基础镜像更新 - 别信
docker images显示的 “2 days ago” —— 那是本地拉取时间,不是镜像构建时间;查真实更新时间得看docker inspect dunglas/frankenphp:latest | jq '.Created'
docker-compose.yml 里没写 image digest 会导致隐性漂移
用 image: dunglas/frankenphp:latest 看似方便,但 :latest 是浮动标签,下次 docker-compose pull 可能拿到完全不同的二进制(比如从 Alpine 切到 Debian 基础镜像),引发扩展兼容问题。
安全做法是锁定具体镜像摘要(digest):
- 先查最新 digest:
docker pull dunglas/frankenphp:latest && docker inspect dunglas/frankenphp:latest | jq -r '.RepoDigests[0]' - 把结果填进
docker-compose.yml:image: dunglas/frankenphp@sha256:abc123... - CI 中每次部署前自动刷新 digest:用
curl -s "https://hub.docker.com/v2/repositories/dunglas/frankenphp/tags/latest" | jq -r '.images[].digest'替换 yml
systemd 服务 reload 不等于重启,旧进程还在跑
很多人改完 ExecStart=/usr/local/bin/frankenphp serve ... 后只执行 systemctl daemon-reload,以为配置生效了——其实旧进程仍在监听端口,新配置根本没加载。
正确流程必须包含终止与验证:
- 先停服务:
systemctl stop frankenphp,确认lsof -i :8080无残留 - 再启动:
systemctl start frankenphp,立刻检查日志:journalctl -u frankenphp -n 20 -f - 关键验证点:看日志第一行是否含
frankenphp v1.3.0(或你期望的版本),而不是旧版的v1.2.5 - 如果用了
Restart=always,记得设RestartSec=2,避免进程刚死就立即重启,掩盖版本未更新问题
Alpine 构建镜像在运行时被误当成 Debian 镜像
FrankenPHP 的 static-builder-musl 镜像和 debian 镜像虽然都叫 :latest,但底层 libc、扩展可用性、甚至 /proc/self/exe 返回路径都不同。若构建阶段用了 Alpine builder,但运行时却因标签混乱跑在 Debian 镜像上,grpc.so 会直接报 undefined symbol: clock_gettime。
防错手段很直接:
- 构建命令必须带明确平台标记:
docker build -f Dockerfile.alpine -t myapp:alpine . - 运行时强制指定:
docker run --platform linux/amd64 myapp:alpine,不依赖默认平台推断 - 容器内验证:
file /usr/local/bin/frankenphp输出应含statically linked和musl;若显示dynamically linked和glibc,说明镜像用错了
:latest 标签不保证 ABI 兼容,一次 docker pull 可能拉到行为不一致的新版本。生产环境必须用 digest 锁定,且每次部署后用 file 和 frankenphp version 双重验证二进制真实性。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











