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

Pan*_*dar 69 python docker kubernetes dockerfile minikube

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

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

并将其加载到 minikube docker Demon 中 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"]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

但是获得以下错误作业并没有成功运行,但是当您单独运行 Dockerfile 时,它​​的工作正常

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

Ruf*_*fus 141

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

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

  • 我在 M1 mac 上使用 Apple Silicon 的 docker 预览版构建了同样的东西。我的解决方案是在不同的设备上构建。 (6认同)
  • 就我而言,我在 Raspberry Pi 上运行 x86-64 架构。必须将基础映像更改为 ARM (5认同)
  • 太疯狂了,这是容器化、docker 等的主要卖点。 (5认同)
  • 哦,我不会想到这一点。该死的M1处理器! (4认同)
  • 您还可以在第一行中添加要构建的平台:`FROM --platform=linux/x86_64 python:3.7-alpine`。这样您就可以在 M1 上构建它并可以在 Linux 计算机上运行该容器。 (2认同)

Vin*_*t J 53

您可能为错误的平台编译了 docker 映像。

例如,如果您在arm64(Apple M1或M2?)上运行并希望编译以在intel/amd上运行,则应使用docker build的--platform选项。

docker build --platform linux/amd64 -t registry.gitlab.com/group/project:1.0-amd64 ./
Run Code Online (Sandbox Code Playgroud)

如果您使用docker-compose.yml构建图像,请使用:

services:
  app:
    platform: linux/amd64
    build: 
      context: ./myapp
      ...
Run Code Online (Sandbox Code Playgroud)

有关 docker 平台命名列表和更多信息,您应该阅读:https ://docs.docker.com/build/building/multi-platform/

提示:要为多个平台构建,请使用--platform linux/amd64,linux/arm64


Lin*_*nPy 51

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

所以你需要(在 Dockerfile 中):

RUN chmod +x /app/helloworld.py
Run Code Online (Sandbox Code Playgroud)

将shebang设置为您的py文件:

#!/usr/bin/env python # whatever your defualt python to run the script
Run Code Online (Sandbox Code Playgroud)

或设置与您相同的命令 Dockerfile

  • 谢谢@LinPy。我经常忘记这一点,而你总是在这里回答。:-) (2认同)

小智 38

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

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

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

当脚本中的第一行创建 shebang 行时,错误消失了,“docker run -it logstashimage:latest sh”完美运行。


小智 11

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

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

services:
    web:
        image: myimage/web:latest
        platform: linux/x86_64
        build:
            context: ./myfolder
            dockerfile: Dockerfile.prod
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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


jaf*_*mlp 6

我最近有这个问题。在这里分享我的经验。基本上我试图ARMX86_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"
    
    Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 运行docker镜像

    $ docker run --rm -t arm32v7/ubuntu uname -m
    armv7l
    
    Run Code Online (Sandbox Code Playgroud)

参考:在 x86 上构建 ARM 容器