阿里云函数计算自定义容器超时 - Macbook M1 Chip

avatar
Mofei Zhu

周末闲来无事,想折腾一下把我的阿里云函数计算从自定义运行环境迁移到自定义容器,结果部署之后发现并不能访问,并返回超时的错误:

{
  "ErrorCode": "CAExited",
  "ErrorMessage": "The function either cannot be started or exited:ContainerStartDuration:120817427318. function cannot be started or exited already: rpc error: code = Code(106) desc = ContainerStartDuration:120000000000. check function health failed due to runtime process not started successfully or not listen on port 9000 "
}

明显是服务没有起起来,但是奇怪的是在本地用s local start --custom-domain auto却可以正常访问。怀疑是函数计算无法访问容器导致的,于是反馈了工单,但并没有得到很好地解决方案。又在钉钉上pin了几位阿里云的同学,经过各种调查测试,最终发现了原因:因为我是用的M1芯片的MacBook,在本地构建的时候,docker会默认使用arm64架构,但是阿里云的函数计算目前只能识别amd64的镜像,所以部署之后。。。。

各种骚操作之后发现了两种解决方案:

解决方案一 - 手动方案(靠谱但是并不推荐):

该方法通过自己在M1上手动构建amd64的镜像,然后手动上传到镜像服务,再在部署的时候指定不push自动构建的image来解决问题,具体的流程如下:

1. Build amd64镜像

export DOCKER_DEFAULT_PLATFORM=linux/amd64 
docker build -t <name>:<version> ./  

2. Push amd64镜像

docker push registry.cn-hangzhou.aliyuncs.com/<name_space>/<name>:<version>

3. 通过非push镜像方式部署服务

s deploy --skip-push

--skip-push 官方说明

解决方案二:

算是一种比较讨巧的方案,在镜像的Dockerfile中的From字段中强制指定使用amd64的镜像 --platform=linux/amd64

FROM --platform=linux/amd64 node:14.5.0-alpine3.11
#...

实测Node的镜像完全没有问题,但是其他的如ASP,GO的镜像即便指定了,构建出来默认也是arm的。所以如果用该方案构建之后还是请运行docker inspect <image>确认一下Architecture是不是amd64