在Kubernetes中运行Python(Django)服务遇exec格式错误求助
问题排查:Pod反复崩溃,报错
exec /usr/local/bin/python: exec format error 环境与配置信息
Dockerfile
ARG PYTHON_VERSION=3.7 FROM python:${PYTHON_VERSION} ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ARG USERID ARG USERNAME WORKDIR /code COPY requirements.txt ./ COPY manage.py ./ RUN pip install -r requirements.txt RUN useradd -u "${USERID:-1001}" "${USERNAME:-jananath}" USER "${USERNAME:-jananath}" EXPOSE 8080 COPY . /code/ RUN pwd RUN ls ENV PATH="/code/bin:${PATH}" # CMD bash ENTRYPOINT ["/usr/local/bin/python"] # CMD ["manage.py", "runserver", "0.0.0.0:8080"]
Kubernetes Deployment清单
apiVersion: apps/v1 kind: Deployment metadata: labels: tier: my-app name: my-app namespace: my-app spec: replicas: 1 selector: matchLabels: tier: my-app template: metadata: labels: tier: my-app spec: containers: - name: my-app image: "<RETRACTED>.dkr.ecr.eu-central-1.amazonaws.com/my-ecr:webv1.11" imagePullPolicy: Always args: - "manage.py" - "runserver" - "0.0.0.0:8080" env: - name: HOST_POSTGRES valueFrom: configMapKeyRef: key: HOST_POSTGRES name: my-app - name: POSTGRES_DB valueFrom: configMapKeyRef: key: POSTGRES_DB name: my-app - name: POSTGRES_USER valueFrom: configMapKeyRef: key: POSTGRES_USER name: my-app - name: USERID valueFrom: configMapKeyRef: key: USERID name: my-app - name: USERNAME valueFrom: configMapKeyRef: key: USERNAME name: my-app - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: key: POSTGRES_PASSWORD name: my-app ports: - containerPort: 8080 resources: limits: cpu: 1000m memory: 1000Mi requests: cpu: 00m memory: 1000Mi
错误日志
exec /usr/local/bin/python: exec format error
本地正常运行的docker-compose配置
services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} web: build: context: . args: USERID: ${USERID} USERNAME: ${USERNAME} command: manage.py runserver 0.0.0.0:8080 volumes: - .:/code ports: - "8080:8080" environment: - POSTGRES_NAME=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} env_file: - .env
问题原因分析
exec format error 本质是镜像架构与Kubernetes集群节点的CPU架构不匹配:
- 本地构建镜像时(比如M系列Mac的ARM64架构),默认生成对应本地架构的镜像;
- 而Kubernetes集群节点(比如AWS EC2的x86_64架构)无法执行ARM架构的二进制文件(此处为
/usr/local/bin/python); - docker-compose在本地运行时,使用与镜像一致的架构,因此无异常。
解决方案
1. 构建指定架构的镜像
针对集群节点的CPU架构(比如x86_64),明确指定架构构建:
# 构建x86_64架构镜像 docker build --platform linux/amd64 -t <你的镜像名>:webv1.11 . # 推送镜像到私有仓库 docker push <你的镜像名>:webv1.11
2. 构建多架构镜像(推荐)
使用Docker Buildx构建支持多架构的镜像,适配不同集群环境:
# 初始化buildx(首次使用) docker buildx create --use # 构建并推送支持amd64、arm64的多架构镜像 docker buildx build --platform linux/amd64,linux/arm64 -t <你的镜像名>:webv1.11 --push .
3. 验证镜像架构
可通过以下命令确认镜像支持的架构:
# 查看本地镜像架构 docker inspect <你的镜像名>:webv1.11 | grep -i architecture # 查看远程镜像架构(需Docker 20.10及以上版本) docker manifest inspect <你的镜像名>:webv1.11
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

