standard_init_linux.go:178:exec用户进程导致"exec格式错误"

Mar*_*ick 50 python linux bash docker

docker开始抛出此错误:

standard_init_linux.go:178:exec用户进程导致"exec格式错误"

每当我使用CMD或ENTRYPOINT运行特定的docker容器时,不考虑对文件的任何更改,然后删除CMD或ENTRYPOINT.这是我一直在使用的docker文件,它在大约一小时前完美运行:

FROM buildpack-deps:jessie

ENV PATH /usr/local/bin:$PATH

ENV LANG C.UTF-8

RUN apt-get update && apt-get install -y --no-install-recommends \
        tcl \
        tk \
    && rm -rf /var/lib/apt/lists/*

ENV GPG_KEY 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
ENV PYTHON_VERSION 3.6.0

ENV PYTHON_PIP_VERSION 9.0.1

RUN set -ex \
    && buildDeps=' \
        tcl-dev \
        tk-dev \
    ' \
    && apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* \
    \
    && wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" \
    && wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \
    && gpg --batch --verify python.tar.xz.asc python.tar.xz \
    && rm -r "$GNUPGHOME" python.tar.xz.asc \
    && mkdir -p /usr/src/python \
    && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \
    && rm python.tar.xz \
    \
    && cd /usr/src/python \
    && ./configure \
        --enable-loadable-sqlite-extensions \
        --enable-shared \
    && make -j$(nproc) \
    && make install \
    && ldconfig \
    \
    && if [ ! -e /usr/local/bin/pip3 ]; then : \
        && wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \
        && python3 /tmp/get-pip.py "pip==$PYTHON_PIP_VERSION" \
        && rm /tmp/get-pip.py \
    ; fi \
    && pip3 install --no-cache-dir --upgrade --force-reinstall "pip==$PYTHON_PIP_VERSION" \
    && [ "$(pip list |tac|tac| awk -F '[ ()]+' '$1 == "pip" { print $2; exit }')" = "$PYTHON_PIP_VERSION" ] \
    \
    && find /usr/local -depth \
        \( \
            \( -type d -a -name test -o -name tests \) \
            -o \
            \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
        \) -exec rm -rf '{}' + \
    && apt-get purge -y --auto-remove $buildDeps \
    && rm -rf /usr/src/python ~/.cache

RUN cd /usr/local/bin \
    && { [ -e easy_install ] || ln -s easy_install-* easy_install; } \
    && ln -s idle3 idle \
    && ln -s pydoc3 pydoc \
    && ln -s python3 python \
    && ln -s python3-config python-config

RUN pip install uwsgi

RUN mkdir /config

RUN mkdir /logs

ENV HOME /var/www

WORKDIR /config

ADD conf/requirements.txt /config

RUN pip install -r /config/requirements.txt

ADD conf/wsgi.py /config

ADD conf/wsgi.ini /config

ADD conf/__init__.py /config

ADD start.sh /bin/start.sh

RUN chmod +x /bin/start.sh

EXPOSE 8000

ENTRYPOINT ["start.sh", "uwsgi", "--ini", "wsgi.ini"]
Run Code Online (Sandbox Code Playgroud)

rbe*_*nto 237

如果映像是在带有Apple M1 Pro芯片(基于 ARM)的MacBook Pro上构建的,也可能会发生此错误,因此默认情况下 Docker 构建命令的目标是.arm64

Docker 实际上将 Apple M1 Pro 平台检测为linux/arm64/v8

为构建命令和版本标记指定平台就足够了:

# Build for ARM64 (default)
docker build -t <image-name>:<version>-arm64 .

# Build for ARM64 
docker build --platform=linux/arm64 -t <image-name>:<version>-arm64 .

# Build for AMD64
docker build --platform=linux/amd64 -t <image-name>:<version>-amd64 .
Run Code Online (Sandbox Code Playgroud)

环境

芯片:Apple M1 Pro,10 个核心(8 个性能和 2 个效率)
Docker 版本 20.10.12,内部版本 e91ed57

  • 我是一个救星!,我正在遭受这个错误,并执行你分享的参考资料,工作得非常有魅力!`产品名称:macOS,产品版本:12.1,构建版本:21C52` (2认同)

Mar*_*ick 130

我忘记了

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

在sh文件的顶部,问题解决了.

  • 我在"#!/ bin/bash"面前有个空格 (7认同)
  • 有人可以解释一下这是什么以及为什么它有效吗? (3认同)
  • 谢谢!经过一个小时的拔毛,10次检查架构(arm/x64等)是否匹配,你的答案保存了一天!ps:对于像我这样创建Linux docker的Windows用户,不要忘记从文件中删除windows换行符(\ r),否则错误会一直出现! (2认同)

Rya*_*yan 86

如果 Docker 映像构建在 M1 芯片上并上传以由 Fargate 部署,那么您\xe2\x80\x99 会注意到 Fargate 中的此容器错误:

\n
standard_init_linux.go:228: exec user process caused: exec format error\n
Run Code Online (Sandbox Code Playgroud)\n

有几种方法可以解决这个问题。您可以:

\n
    \n
  • 使用以下命令构建您的 docker 镜像:
  • \n
\n
docker buildx build --platform=linux/amd64 -t image-name:version .\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 使用以下命令更新您的 Dockerfile\xe2\x80\x99s FROM 语句
  • \n
\n
FROM --platform=linux/amd64 BASE_IMAGE:VERSION\n
Run Code Online (Sandbox Code Playgroud)\n


Ale*_*eph 72

如果您尝试在 arm64/aarch64 机器上运行 x86 构建的映像,就会发生这种情况。

您需要使用相应的架构重建映像

  • 如果有人在 x86 机器上运行映像时遇到此问题,请使用“--platform linux/amd64”构建 docker 映像。 (55认同)
  • 谢谢你!我最近将我的 docker 内容移至树莓派上的 Kubernetes - 忘记了不同的架构 - 必须更改我的所有映像以使用 arm32v7 或 arm64v8。你为我指明了正确的方向! (5认同)
  • 对我来说,我正在 Mac Apple Silicon(arm) 中构建映像并在 x86(amd) EC2 上运行。希望吸取教训,下次我会更快地纠正这个错误:) (5认同)
  • 如何使用不同的架构重建图像? (2认同)
  • 随着 ARM 在开发机器上越来越流行,并且人们尝试将映像部署到 x86_64 实例,这将是非常有用的信息!谢谢。 (2认同)

kse*_*ley 28

如果您在 AWS ECS 中获得此映像,则您可能是使用 Apple M1 Pro 芯片构建的映像。在您的 Dockerfile 中,您可以添加以下内容: FROM --platform=linux/amd64 <image>:<tag>.

如果您使用子图像,例如:FROM <parent_image_you_created>:<tag>您需要确保它<parent_image_you_created>:<tag>是使用FROM --platform=linux/amd64 <image>:<tag>.


rv.*_*tch 17

我目前正在使用 M1 Mac,早些时候我也遇到过这个问题。实际上,我意识到我作为堆栈的一部分部署的 Fargate 任务已经一个多月没有运行了,因为我将它部署在我的 M1 Mac 笔记本电脑上。部署脚本在我的旧的基于 Intel 的 Mac 上运行良好。

我刚刚在 CW 日志中注意到的错误(任务又失败了一个多月)如下:

standard_init_linux.go:228: exec user process caused: exec format error
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,在所有docker build步骤中——因为我有一个用于构建 lambda 层,另一个用于构建 Fargate 任务——我刚刚更新以添加--platform=linux/amd64. 请注意,如果我在参数后添加标签-t,例如像img-test:0.1-amd64. 我想知道这是否可能是因为我:latest稍后在脚本中引用了该标签。

无论如何,这些都是必要的改变。你会注意到,我真正所做的只是添加了--platform参数;其他一切都保持不变。

ecr_repository="some/app"

docker build -t ${ecr_repository} \
        --platform=linux/amd64 \
        --build-arg SOME_ARG='value' \
        .
Run Code Online (Sandbox Code Playgroud)

我不确定技术上是否需要,但为了安全起见,我还更新了FROM我的 s 中的所有声明Dockerfile

FROM --platform=linux/amd64 ubuntu:<version>
Run Code Online (Sandbox Code Playgroud)


rai*_*op3 12

添加此代码

   #!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)

在脚本文件的顶部。

  • 这有效!!但为什么??:sweat_smile: (2认同)
  • @jjmerelo我不同意:在文件不可执行的情况下 - 你会得到一个不同的错误,说“没有足够的权限”。 (2认同)

Ran*_* MV 8

遇到同样的错误,我在更改为 AMD 后正在构建 ARM 映像。问题已解决

该错误通常意味着您正在尝试在非 amd64 主机(例如 32 位或 ARM)上运行此 amd64 映像。

使用buildx并指定 --platfom linux/amd64尝试构建

示例命令

docker buildx  build -t ranjithkumarmv/node-12.13.0-awscli . --platform linux/amd64
Run Code Online (Sandbox Code Playgroud)


Rya*_*len 7

另一个可能的原因可能是文件以 Windows 行结尾 (CRLF) 保存。使用 Unix 行结尾 (LF) 保存它,然后将找到该文件。


pme*_*pme 7

扩展到接受的答案:

对于高山(无 bash)图像:

#!/bin/ash
Run Code Online (Sandbox Code Playgroud)

在 sh 文件的顶部,解决了问题。


小智 5

对于那些尝试在 amd64 Linux 系统上构建 aarch64 或 armv7l 架构的映像并遇到相同错误的人:检查是否qemu-user-static安装了软件包。sudo apt install qemu-user-static如果没有,请在 Ubuntu/Debian/Mint 等上安装,或者在sudo dnf install qemu-user-staticFedora 上安装