Почему не мой docker-entrypoint.sh казнить?

мой ENTRYPOINT скрипт не выполняется и выдает standard_init_linux.go:175: exec user process caused "no such file or directory". Почему?

не работает

$ docker build -t gilani/trollo . && docker run gilani/trollo
Sending build context to Docker daemon   126 kB
Step 1 : FROM vault:latest
 ---> 1f127f53f8b5
Step 2 : MAINTAINER Amin Shah Gilani <gilani@payload.tech>
 ---> Using cache
 ---> 86b885ca1c81
Step 3 : COPY vaultConfig.json /vault/config
 ---> Using cache
 ---> 1a2be2fa3acd
Step 4 : COPY ./docker-entrypoint.sh /
 ---> Using cache
 ---> 0eb7c1c992f1
Step 5 : RUN chmod +x /docker-entrypoint.sh
 ---> Running in 251395c4790f
 ---> 46aa0fbc9637
Removing intermediate container 251395c4790f
Step 6 : ENTRYPOINT /docker-entrypoint.sh
 ---> Running in 7434f052178f
 ---> eca040859bfe
Removing intermediate container 7434f052178f
Successfully built eca040859bfe
standard_init_linux.go:175: exec user process caused "no such file or directory"

Dockerfile:

FROM vault:latest

MAINTAINER Amin Shah Gilani <gilani@payload.tech>

COPY vaultConfig.json /vault/config

COPY ./docker-entrypoint.sh /

RUN chmod +x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint.sh:

#!/bin/bash

echo 'Hello World!'

работает

$ docker build -t gilani/trollo . && docker run gilani/trollo
Sending build context to Docker daemon   126 kB
Step 1 : FROM vault:latest
 ---> 1f127f53f8b5
Step 2 : MAINTAINER Amin Shah Gilani <gilani@payload.tech>
 ---> Using cache
 ---> 86b885ca1c81
Step 3 : COPY vaultConfig.json /vault/config
 ---> Using cache
 ---> 1a2be2fa3acd
Step 4 : ENTRYPOINT echo 'hello world'
 ---> Using cache
 ---> ef5792a1f252
Successfully built ef5792a1f252
'hello world'

Dockerfile:

FROM vault:latest

MAINTAINER Amin Shah Gilani <gilani@payload.tech>

COPY vaultConfig.json /vault/config

ENTRYPOINT ["echo", "'hello world'"]

7 ответов


на vault:latest изображение не содержит /bin/bash который вы пытаетесь вызвать с помощью shebang #!/bin/bash. Вы должны либо изменить это на #!/bin/sh или полностью удалить shebang из вашего скрипта.


я рвал волосы с проблемой, очень похожей на эту. В моем случае / bin / bash существовал. Но на самом деле проблема заключалась в завершении строки windows.

в моем случае репозиторий git имел скрипт точки входа с окончаниями строк Unix (\n). Но когда репозиторий был извлечен на машине windows, git решил попытаться быть умным и заменить окончания строк в файлах окончаниями строк windows (\r\n).

Это означало, что shebang не работал, потому что вместо того, чтобы искать /bin/bash, он искал /bin/bash\r

решением для меня было отключить автоматическое преобразование git: git config --глобальное ядро.autocrlf вход Затем снова проверьте репозиторий и перестройте

более полезная информация здесь: как изменить настройки окончания строки и здесь http://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/


Не видя вашего изображения, моя первоначальная идея заключается в том, что у вас нет /bin/bash в вашем изображении. Изменение первой строки docker-entrypoint.sh кому:

#!/bin/sh

скорее решить ее.


другая возможность:

убедитесь, что файл не сохраняется с окончаниями строк Windows (CRLF). Если это так, сохраните его с окончаниями строк Unix (LF), и он будет найден.


мой случай состоял в том, что альпийский образ, который я использовал, не пришел с Башем вообще... RUN apk-install bash сделал трюк, очевидно


еще одна причина, по которой эта ошибка возникает, если ваш пароль пользователя Windows изменяется.

в моем случае мой entrypoint.sh окончания строк были LF, но я все еще получал ошибку. Наш администратор имеет обязательный сброс пароля примерно каждый месяц или около того. Всякий раз, когда это происходит, я сталкиваюсь с ошибкой. Если это ваша причина, вам может потребоваться сбросить учетные данные в настройках docker в разделе "Общие диски".

снимите диск и применить. Затем повторно выберите диск и примените. Он предложит вам ввести пароль.


эта проблема связана с окончаниями строк, и я решил ее с решением ниже

преобразовать файл DOS в формат unix. Это удаляет все проводные окончания линии.

dos2unix - доступен в alpine, а также в других дистрибутивах Linux.

Я использовал его так:

запустить apk добавить dos2unix & & dos2unix /entry.sh