standard_init_linux.go:211:exec用户进程导致“ exec格式错误”

时间:2019-10-09 07:08:05

标签: python docker kubernetes dockerfile minikube

我正在构建用于python脚本的Dockerfile,它将在下面的minikube Windows 10系统中运行。

使用以下命令构建docker docker build -t python-helloworld .

并将其加载到minikube docker恶魔中 docker save python-helloworld | (eval $(minikube docker-env) && docker load)

Docker文件

FROM python:3.7-alpine
#add user group and ass user to that group
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

#creates work dir   
WORKDIR /app

#copy python script to the container folder app
COPY helloworld.py /app/helloworld.py

#user is appuser
USER appuser

ENTRYPOINT  ["python", "/app/helloworld.py"]

pythoncronjob.yml文件(cron作业文件)

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: python-helloworld
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      backoffLimit: 5
      template:
        spec:
          containers:
          - name: python-helloworld
            image: python-helloworld
            imagePullPolicy: IfNotPresent
            command: [/app/helloworld.py]
          restartPolicy: OnFailure

以下是运行此Kubernetes作业的命令 kubectl create -f pythoncronjob.yml

但是无法成功运行以下错误作业,但是当您单独运行Dockerfile时,它的工作正常

standard_init_linux.go:211:exec用户进程导致“ exec格式错误”

7 个答案:

答案 0 :(得分:44)

当您的主机与来宾容器映像的体系结构不同时,也会发生这种情况。

例如在具有x86-64架构的主机上运行Arm容器

答案 1 :(得分:6)

我最近遇到了这个问题。在这里分享我的经验。基本上,我试图在 ARM 架构上运行 X86_64 docker 映像。

这是我遵循的步骤

  1. 检查主机架构

     uname -m # Display the host architecture
     #x86_64
    
     docker pull arm32v7/ubuntu # Get ARM docker image
    
     docker run --rm -t arm32v7/ubuntu uname -m
     standard_init_linux.go:211: exec user process caused "exec format error"
    
  2. 在 x86 上设置 ARM 仿真

使用 QEMU 允许我们在 x86 机器上构建 ARM 二进制文件,而无需交叉编译器。

sudo apt-get install qemu binfmt-support qemu-user-static # Install the qemu packages
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # This step will execute the registering scripts
  1. 运行 docker 镜像

    $ docker run --rm -t arm32v7/ubuntu uname -m
    armv7l
    

参考:Building ARM container on x86

答案 2 :(得分:4)

我看到您将命令command: [/app/helloworld.py]添加到yaml文件中。

所以您需要(在Dockerfile中):

RUN chmod +x /app/helloworld.py

将shebang设置为您的py文件:

#!/usr/bin/env python # whatever your defualt python to run the script

或设置与Dockerfile中相同的命令

答案 3 :(得分:2)

如果您在 Windows 上运行docker,还有两个原因可能会引起此问题:

  • 脚本行结尾不是LF(linux)
  • 脚本编码应为utf-8 + BOM

答案 4 :(得分:1)

Rufus 是正确的,我在尝试在 arm64 的 M1 MacBook 上构建 x86 服务器映像时遇到了这个问题。

通过将“平台”属性添加到我的 docker-compose.yml,我能够构建正确的目标架构。

services:
    web:
        image: myimage/web:latest
        platform: linux/x86_64
        build:
            context: ./myfolder
            dockerfile: Dockerfile.prod

答案 5 :(得分:0)

我最近在运行Logstash容器时遇到了问题

standard_init_linux.go:211:exec用户进程导致“ exec格式错误”

注意到entrypoint.sh的shebang行(#!/ bin / sh)是在第二行而不是entrypoint.sh文件的第一行中键入的。

在脚本的第一行进行了shebang行时,错误消失了,并且 “ docker run -it logstashimage:latest sh” 可以正常工作。

答案 6 :(得分:0)

我遇到了完全相同的错误消息。它是通过在主机上安装 qemu 来修复的。不知道原因。