Alpine Python image throw exe c пользовательский процесс вызвал «нет такого файла или каталога», в котором работает Raspian / Debian - PullRequest
0 голосов
/ 11 июля 2020

Простой файл Dockerfile, который выполняет сценарий оболочки как точку входа, подобную этой

FROM python:3
WORKDIR /app

COPY . .
RUN chmod +x entrypoint.sh
CMD ["python", "/app/src/api.py"]
ENTRYPOINT ["./entrypoint.sh"]

работает: вызывается entrypoint.sh, который сам выполняет python /app/src/api.py на RPI 3.

entrypoint.sh

#!/bin/bash
echo starting entrypoint
set -x
exec "$@"

Поскольку мне не нужно ничего, специфичного для Debian / Raspbian c, я хотел бы использовать образ alpine для уменьшения размера образа. Поэтому я изменил FROM python:3 на FROM python:3-alpine без каких-либо дальнейших изменений.

Но теперь контейнер не запускается:

api_1      | standard_init_linux.go:211: exec user process caused "no such file or directory"
test_api_1 exited with code 1

Почему это не работает на Alpine? Я не вижу никаких проблем, так как /app/entrypoint.sh существует, и он также исполняемый:

Step 5/7 : RUN ls -lh
 ---> Running in d517a83c5b9b
total 12K    
-rwxr-xr-x    1 root     root          54 Jul 11 18:35 entrypoint.sh
drwxr-xr-x    2 root     root        4.0K Jul 11 18:48 src

В аналогичном вопросе изображение было собрано в системе без руки. Для меня это не так, я строю непосредственно на RPI.

Не уверен, связано ли это с Raspbian или Alpine. Я также пробовал использовать абсолютный путь ENTRYPOINT ["/app/entrypoint.sh"]: все еще работаю над изображением python:3, но не в python:3-alpine.

1 Ответ

1 голос
/ 11 июля 2020

Проблема заключалась в том, что моя точка входа использует bash как shebang, не задумываясь об этом:

#!/bin/bash
echo starting entrypoint
set -x
exec "$@"

Но alpine не включает GNU Bash, который по умолчанию установлен в Debian / Raspbian. такой файл или каталог не был указан интерпретатору из shebang, а не сам сценарий точки входа.

Поскольку мой сценарий не является отступом для создания чего-то, что требует bash функций, я просто изменил #!/bin/bash на #!/bin/sh, и его также можно было запустить на образе alpine.

...