Как исправить "пользовательский процесс exec не вызвал такой файл или каталог" - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь использовать tini в моем Dockerfile, но получаю ошибку.

Я использовал пример кода из файла tini readme.

# ... code which builds /app/foo

# Add Tini
ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]

# Run the program when the container starts
CMD ["/app/foo"]

Я ожидаю, что моя программа будет работать без PID=1, но вместо этого я получу: standard_init_linux.go:207: exec user process caused "no such file or directory"

EDIT:

/app/foo создается в начале Dockerfile. С /app/foo проблем нет. В доказательство этого, если я закомментирую строку ENTRYPOINT (или удалим весь связанный с tini код), мой /app/foo будет работать нормально, за исключением того факта, что он имеет PID=1

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Как упоминает Дэвид, вам нужно проверить, что загружается. Если вы запустите это вручную на изображении Alpine, вы увидите точную проблему:

$ docker run -it --rm alpine /bin/sh
/ # apk add file
...
/ # apk add curl
...
/ # curl -sSL https://github.com/krallin/tini/releases/download/v0.18.0/tini >tini
/ # chmod 755 tini
/ # file tini
tini: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=38c262787814dc459678c8f24710bbde944b7e56, stripped
/ # ldd tini
        /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1beab2a000)
Error relocating tini: __fprintf_chk: symbol not found
/ # ./tini
/bin/sh: ./tini: not found
/ # ls -al /lib64/ld-linux-x86-64.so.2
ls: /lib64/ld-linux-x86-64.so.2: No such file or directory

Обратите внимание на динамически связанную часть и тот факт, что она ищет libc. Ошибка в альпийском сценарии говорит вам, что libc не существует. Вы также можете увидеть это на скретч-изображении.

Вы можете либо получить версию tini, которая полностью статически скомпилирована, либо перейти на систему с установленной libc. Для первого, с Tini, это так же просто, как загрузить другой URL:

ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
0 голосов
/ 29 июня 2019

Еще одной причиной проблемы, указанной выше, может быть то, что вызывается скрипт, который использует недоступную оболочку.Например, когда первая строка скрипта имеет вид

#!/bin/bash

, то для этого требуется bash в системе.Изменение bash на значение по умолчанию sh(ell) для системы может быть решением.Итак, замените на

#!/bin/sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...