Как получить сценарий точки входа с помощью Docker? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть образ Docker, и я могу его запустить:

docker run -it --entrypoint="/bin/bash" gcr.io/docker:tag

Затем я могу создать скрипт следующим образом:

root@86bfac2f6ccc:/# source entrypoint.sh

Скрипт выглядит так:

more entrypoint.sh
#!/bin/bash
. /env.sh
. /root/miniconda3/etc/profile.d/conda.sh
conda activate base
exec "$@"

Которые активируют базовые невр:

(base) root@86bfac2f6ccc:/#

Пока все хорошо, но мне не удалось включить это в Dockerfile или в качестве параметров для docker run:

Я пробовал много вещей:

Например:

docker run -it --entrypoint="/bin/bash"  gcr.io/docker:tag  source entrypoint.sh
/bin/bash: source: No such file or directory

Но скрипт существует и может быть выполнен:

docker run -it --entrypoint="/bin/ls"  gcr.io/docker:tag -la
...
-rwxr-xr-x  1 root root   94 Apr 26 20:36 entrypoint.sh
...

Или:

docker run -it --entrypoint="/bin/bash"  gcr.io/docker:tag  ". /entrypoint.sh"
/bin/bash: . /entrypoint.sh: No such file or directory

Или в файле Docker:

ENTRYPOINT ["source", "/entrypoint.sh"]

Я думаю, у меня проблема, возможно, связана с тем, что source оценивает скрипт в текущей оболочке.

Любое руководство для достижения того, что я хочу?Это кажется совершенно очевидным, но я не в себе.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Когда Docker запускает контейнер, он состоит из двух частей: «точка входа» и «команда». Когда оба параметра указаны, часть «command» передается в качестве аргументов командной строки в часть «entrypoint».

В частности, у сценария, который вы показываете, есть очень типичный шаблон для сценария точки входа:

#!/bin/sh
# ... do some setup ...
# then run the CMD passed as command-line arguments
exec "$@"

Если ваш Dockerfile называет этот скрипт своим ENTRYPOINT, то вы хотите передать команду, которую хотите запустить, как часть «команда». Если вы запускаете вашу оболочку как просто

docker run --rm -it gcr.io/docker:tag sh

затем sh будет передан сценарию точки входа, который выполнит настройку и затем в конечном итоге запустит ее.

(Помните, что source является расширением для конкретного поставщика и не существует во многих оболочках, как минимальная оболочка BusyBox, которую используют базовые образы Alpine, но это . означает то же самое и соответствует стандарту POSIX Так как контейнер запускает только один процесс, он также не имеет смысла для того, чтобы этот один процесс был «источником этого файла», он установил бы некоторые переменные окружения, и затем это было сделано, так что контейнер завершил работу. setup, а затем запускает команду основного контейнера.)

0 голосов
/ 13 июня 2019

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

ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

Однако не очень хорошая идея запускать оболочку как начальный процесс в контейнере.Это портит обработку сигнала.Вы заметите, что не можете остановить выполнение с помощью Ctrl-C.Поэтому для запуска оболочки используйте CMD вместо ENTRYPOINT.Начальный процесс с идентификатором 1 должен быть минимальным процессом инициализации, таким как tini.

...