Docker/docker-compose部署正常 K8s部署报exec格式错误解决方案
问题场景
现有基于以下Dockerfile构建的应用镜像:
FROM python:latest WORKDIR /app COPY ./requirements.txt . RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["uvicorn", "api.app:app", "--port", "5000", "--host", "0.0.0.0"] st", "0.0.0.0"]
该镜像通过docker run -it piotrostr/premiere命令可正常启动,使用docker-compose部署也无异常,但使用如下Kubernetes Deployment清单创建部署时:
--- apiVersion: apps/v1 kind: Deployment metadata: name: premiere-api spec: selector: matchLabels: name: premiere-api replicas: 3 template: metadata: labels: name: premiere-api spec: containers: - name: premiere-api image: docker.io/piotrostr/premiere env: - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: premiere-secrets key: POSTGRES_PASSWORD optional: false - name: POSTGRES_USERNAME valueFrom: secretKeyRef: name: premiere-secrets key: POSTGRES_USERNAME optional: false - name: POSTGRES_HOST value: db ports: - containerPort: 5000 imagePullSecrets: - name: regcred restartPolicy: Always
容器启动失败直接退出,抛出错误:
exec /usr/local/bin/uvicorn: exec format error
此前在开启CGO编译的场景下曾遇到过同类错误,禁用CGO后即可解决;本次构建镜像时已显式添加--platform linux/amd64参数指定构建平台,但错误仍然存在。
解决方案
经排查,该问题核心原因是容器镜像与Kubernetes节点的CPU架构不匹配。虽然构建时指定了平台参数,但默认的python:latest基础镜像存在架构适配拉取异常,直接将基础镜像替换为明确适配amd64架构的amd64/python镜像即可修复,修改后的Dockerfile基础镜像配置如下:
FROM amd64/python:latest
如果使用skaffold完成镜像构建与部署流程,还需要在skaffold配置中显式指定目标构建平台,避免构建过程拉取错误架构的镜像层,配置示例如下:
... build: artifacts: ... docker: dockerfile: Dockerfile platforms: ["linux/amd64"] ...
内容的提问来源于stack exchange,提问作者Piotr
相关产品推荐
相关产品推荐

