Исходный скрипт на интерактивной оболочке внутри контейнера Docker - PullRequest
0 голосов
/ 08 мая 2018

Я хочу открыть интерактивную оболочку, которая поставляет скрипт для использования среды бит-бека в репозитории, к которому я привязываю mount:

docker run --rm -it \
--mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory  \
my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh"

Проблема в том, что аргумент -it, похоже, не имеет никакого эффекта, поскольку оболочка завершает работу сразу после выполнения cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh

Я тоже пробовал это:

docker run --rm -it \
--mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory  \
my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh && bash"

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

Есть ли способ обеспечить tty сценарием с правильным исходным кодом?

1 Ответ

0 голосов
/ 08 мая 2018

Флаг -it вступает в противоречие с командой для запуска, в которой вы указываете docker создать псевдо-терминал (ptty), а затем запускаете команду в этом терминале (bash -c ...). Когда эта команда завершается, выполнение завершается.

Чтобы обойти это, некоторые люди сделали только переменные export в своей исходной среде, и последняя команда будет exec bash. Но если вам нужны псевдонимы или другие элементы, которые не наследуются таким образом, тогда ваши параметры немного более ограничены.

Вместо запуска исходного кода в родительской оболочке, вы можете запустить его в целевой оболочке. Если вы изменили свой .bash_profile, включив в него следующую строку:

[ -n "$DOCKER_LOAD_EXTRA" -a -r "$DOCKER_LOAD_EXTRA" ] && source "$DOCKER_LOAD_EXTRA”

и тогда ваша команда была:

... /bin/bash -c "cd /mnt/bb_repository/oe-core && DOCKER_LOAD_EXTRA=build/conf/set_bb_env.sh exec bash"

это может сработать. Это говорит вашему .bash_profile загружать этот файл, когда переменная env уже установлена, но не иначе. (Также может быть флаг -e в командной строке докера, но я думаю, что он устанавливает его глобально для всего контейнера, что, вероятно, не то, что вы хотите.)

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