standard_init_linux.go: 178: процес користувача exec спричинив "помилку формату exec"


88

docker почав видавати цю помилку:

standard_init_linux.go: 178: процес користувача exec спричинив "помилку формату exec"

кожного разу, коли я запускаю конкретний контейнер докера з CMD або ENTRYPOINT, без урахування будь-яких змін у файлі, крім видалення CMD або ENTRYPOINT. ось файл докера, з яким я працював, який чудово працював приблизно годину тому:

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"]

Відповіді:


202

Я забув поставити

#!/bin/bash

у верхній частині файлу sh, проблема вирішена.


4
Дякую! Після години витягування волосся та 10 разів перевірки, чи відповідають архітектури (arm / x64 тощо), ваша відповідь зберегла день !. ps: Для користувачів Windows, таких як я, що створюють linux-докер, не забувайте видаляти символи нового рядка (\ r) з вашого файлу, інакше помилки постійно з'являються!
Маартен Кіфт

Я працював після використання цього рішення, раніше я стикався з такою ж проблемою.
акшат такар

8
У мене був пробіл перед моїм "#! / Bin / bash"
ArunTejCh

Я якось прибрав #на початку моєї точки входу. Яка витрата часу.
подрібнення

Це навіть не стосується Docker, це просто завжди трапляється під час запуску сценарію Bash із .NET Core.
Ендрю Костер

33

Додайте цей код

   #!/usr/bin/env bash

у верхній частині файлу сценарію.


1
@akki точка входу повинна бути виконуваною. Якщо початковий файл оболонки не був, це спричинило помилку.
джеймерело

приємно, ти рятуєш мій день
Кенні Лі

1
@jjmerelo Я не згоден: у випадку, коли файл не є виконуваним - ви отримуєте іншу помилку, кажучи "недостатньо дозволів".
Інокентій

13

Це може статися, якщо ви намагаєтеся запустити вбудований образ x86 на машині arm64 / aarch64.

Вам потрібно буде перебудувати зображення за допомогою відповідної архітектури


3
Дякую! Нещодавно я переніс свої матеріали з докера в Kubernetes на малиновому пі - забувши про іншу архітектуру - довелося змінити всі мої зображення, щоб використовувати arm32v7 або arm64v8. Ви вказали мені в правильному напрямку!
MichaelEaton

5

Іншою можливою причиною цього може бути, якщо файл зберігається із закінченнями рядків Windows (CRLF). Збережіть його із закінченнями рядків Unix (LF), і файл буде знайдено.


2

Поширюючись на прийняту відповідь:

Для альпійського (без баша) зображення:

#!/bin/ash

у верхній частині файлу sh, вирішує проблему.


1

Я зіткнувся з такою ж проблемою в RHEL 7.3, docker 17.05-ce під час запуску завантаженого в автономному режимі зображення. Здавалося, драйвер пам’яті за замовчуванням RHEL / CentOS змінено з device-mapper на overlay. Повернення драйвера назад до devicemapper вирішило проблему.

dockerd --storage-driver=devicemapper

або

/etc/docker/daemon.json
{
  "storage-driver": "devicemapper"
}

Це було єдиним робочим рішенням для мене. Я віддаю перевагу рішенню конфігурації, оскільки інше породжує новий активний процес і може виправити його лише тимчасово.
ST-DDT

1

Ще одна можливість полягає в тому, що #! / Bin / bash знаходиться не в самому першому рядку. Перед цим не повинно бути нічого (ні порожніх рядків, нічого).


0

Не пряма відповідь на поставлене запитання. Хоча я отримав помилку під час виклику "docker-compose up", щоб підняти мою програму nodejs. Зрозумів, що у своєму "Dockerfile" я мав CMD ["./server.js"].

Для виправлення я замінив його на, CMD ["npm","start"]і це вирішило проблему. Сподіваюся, якщо хтось приземлиться тут для цього винятку, це може виявитися корисним.


0

У моєму випадку я "злив" свою ECS інстансом і знову "активував" їх, а потім помилка зникла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.