Laravel Vapor自定义Docker容器部署失败求助
解决Laravel Vapor自定义Docker容器部署失败(媒体类型不支持)问题
问题背景
将Laravel Vapor切换为自定义Docker容器后,执行vapor deploy时部署失败,AWS提示源镜像的清单或层媒体类型不支持。相关配置及环境如下:
Dockerfile配置
FROM laravelphp/vapor:php83-arm COPY . /var/task
vapor.yml配置片段
adamsportal: memory: 1024 storage: adamsportal-storage cli-memory: 512 domain: adamsportal.theowldev.co.uk database: nest-db-test2 network: nest2-test-network runtime: docker-arm build: - "COMPOSER_MIRROR_PATH_REPOS=1 composer install --no-dev" - "php artisan event:cache" - "npm ci && npm run build && rm -rf node_modules"
ECR镜像清单问题
已上传至ECR的镜像清单包含一个architecture和os均为unknown的manifest条目:
{ "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests": [ { "mediaType": "application/vnd.oci.image.manifest.v1+json", "size": 4663, "digest": "sha256:942a74e943c5d3eb617d58947806beb9a9371b8b016b2e1150f1c317ac04cbe9", "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.oci.image.manifest.v1+json", "size": 566, "digest": "sha256:1340c45ef59e13199ae781ccf573eb02d6280ae564134144e0b2cfac60e2874e", "platform": { "architecture": "unknown", "os": "unknown" } } ] }
环境信息
- Laravel Vapor 1.65.1
- Docker Desktop 4.38.0(181591)
- Mac Pro M2 PRO
解决方案
问题出在Docker构建时生成了包含unknown架构的多平台镜像索引,而AWS Lambda(Laravel Vapor依赖的底层服务)不支持这种非标准的manifest条目。可以通过以下步骤修复:
1. 指定单一平台构建镜像
在构建Docker镜像时,明确指定平台为linux/arm64,避免生成多余的unknown架构manifest:
docker build --platform linux/arm64 -t your-image-name .
或者在Dockerfile开头添加平台声明:
# syntax=docker/dockerfile:1.4 FROM --platform=linux/arm64 laravelphp/vapor:php83-arm COPY . /var/task
2. 调整Vapor构建流程
如果使用Vapor自动构建镜像,可在项目根目录创建docker-build.sh脚本:
#!/bin/bash docker build --platform linux/arm64 -t "$VAPOR_IMAGE_NAME" .
然后在vapor.yml中替换build配置:
build: - "./docker-build.sh" - "COMPOSER_MIRROR_PATH_REPOS=1 composer install --no-dev" - "php artisan event:cache" - "npm ci && npm run build && rm -rf node_modules"
3. 清理ECR中的旧镜像
删除ECR中包含unknown架构的旧镜像,确保新上传的镜像只有linux/arm64的manifest:
aws ecr batch-delete-image --repository-name your-repo-name --image-ids imageTag=your-tag
4. 重新部署
执行vapor deploy重新部署,此时镜像清单应该只包含arm64架构的条目,AWS Lambda就能正常识别。
内容的提问来源于stack exchange,提问作者Adam Groom
相关产品推荐
相关产品推荐

