NextJS从13.4.13升级至13.4.15后,Docker部署Cloud Run失败求助
问题背景
NextJS应用从13.4.13升级到13.4.19后,Cloud Run部署报错:
ERROR: (gcloud.run.services.update) Revision 'devrel-demos-00085-yaf' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
经测试,13.4.13可正常部署,13.4.15及以上版本失败,原因是NextJS 13.4.15版本中对next-server的IPv6支持优化导致默认监听地址变更,Cloud Run的健康检查无法访问容器服务。
解决方法
方法1:修改启动命令绑定IPv4地址
在项目的package.json中,修改start脚本,指定监听0.0.0.0(允许所有IPv4和IPv6地址访问):
{ "scripts": { "start": "next start -H 0.0.0.0" } }
方法2:通过Dockerfile设置环境变量
在Dockerfile中添加环境变量HOST=0.0.0.0,让NextJS启动时自动绑定该地址:
# 保留原有镜像构建步骤... ENV HOST=0.0.0.0 CMD ["npm", "start"]
方法3:通过Cloud Run配置环境变量
无需修改代码或Dockerfile,直接在Cloud Run服务中设置环境变量:
- 使用gcloud命令部署时添加:
gcloud run services update [你的服务名] --set-env-vars HOST=0.0.0.0
- 或在Google Cloud控制台的Cloud Run服务设置页面,手动添加环境变量
HOST=0.0.0.0
验证部署
修改完成后重新构建镜像并部署到Cloud Run,此时容器会监听0.0.0.0:8080,Cloud Run的健康检查可以正常访问,服务即可正常启动。
内容的提问来源于stack exchange,提问作者Luke Schlangen

