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

Posted

技术标签:

【中文标题】standard_init_linux.go:211:执行用户进程导致“执行格式错误”【英文标题】:standard_init_linux.go:211: exec user process caused "exec format error" 【发布时间】:2020-02-06 11:22:35 【问题描述】:

我正在为 python 脚本构建 Dockerfile,它将在 minikube windows 10 系统中运行,下面是我的 Dockerfile

使用以下命令构建 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 格式错误”

【问题讨论】:

相关:***.com/questions/42494853/… 【参考方案1】:

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

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

【讨论】:

就我而言,我在 Raspberry Pi 上运行 x86-64 架构。必须将基础映像更改为 ARM 我在 M1 mac 上构建了相同的东西,并为 Apple Silicon 提供了 docker 预览。我的解决方案是在不同的设备上构建。 太疯狂了,这就是容器化、docker等的主要卖点。 哎呀我没想到。该死的M1处理器! @mawburn 我知道那种感觉【参考方案2】:

我可以看到您将命令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中一样设置命令

【讨论】:

感谢@LinPy。我经常忘记这一点,你总是在这里回答。 :-) 我在 SageMaker 环境中运行 docker 时遇到了同样的问题。这个解决方案非常有效,非常感谢!【参考方案3】:

我最近在运行logstash容器时遇到了这个问题

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

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

当 shebang 行作为脚本中的第一行时,错误消失了,"docker run -it logstashimage:latest sh" 运行良好。

【讨论】:

【参考方案4】:

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

这是我遵循的步骤

    检查主机架构

     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"
    

    在 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

    运行 docker 镜像

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

参考:Building ARM container on x86

【讨论】:

【参考方案5】:

对于那些想要编译用于生产用途的 arm64(Apple M1?), 我设法使它与 docker build 的 --platform 选项一起工作。

docker build --platform linux/amd64 -t registry.gitlab.com/group/project:1.0-amd64 ./

您也可以选择linux/arm64

【讨论】:

【参考方案6】:

如果您在 Windows 上运行 docker,另外两个原因可能会引发此问题:

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于standard_init_linux.go:211:执行用户进程导致“执行格式错误”的主要内容,如果未能解决你的问题,请参考以下文章