我有一个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)构建。
确保使用正确的目标平台进行构建,或者一次构建多个映像,以便容器运行时可以为执行平台提取正确的映像。