容器在使用Docker和Docker语言 - compose时可以很好地部署,但在使用kubernetes时就失败了



我有一个docker容器,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"]

它运行得很好,但是当使用清单安排部署时:

---
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

I run into a error:

exec /usr/local/bin/uvicorn: exec format error

这使得容器退出。使用docker run -it piotrostr/premiere运行容器,与使用docker-compose运行容器相同。

以前有人遇到过这个问题吗?它发生在我一次启用CGO,但是禁用它会使执行错误消失。我试图用--platform linux/amd64显式地构建图像,但上面的错误仍然存在。

解决平台确实是错误的,解决方案是使用amd64/python图像代替常规的python图像。

FROM amd64/python:latest

如果使用skafold -,应确保配置指定平台。在下面的例子。

...
build:
artifacts:
...
docker:
dockerfile: Dockerfile
platforms: ["linux/amd64"]
...

看起来您正在为不同的平台(例如M1 mac或raspberry pi上的ARM)而不是执行环境(例如amd64)构建。

确保使用正确的目标平台进行构建,或者一次构建多个映像,以便容器运行时可以为执行平台提取正确的映像。

最新更新