Проблема при выполнении сценария оболочки, присутствующего на хосте, с помощью docker exec - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь выполнить скрипт на главном узле кластера EMS AWS. Намерение состоит в том, чтобы создать новый conda env и связать его с jupyter. Я подписан на этот документ от AWS. Проблема в том, что независимо от содержимого скрипта, я получаю ту же ошибку: bash: /home/hadoop/scripts/bootstrap.sh: No such file or directory при выполнении sudo docker exec jupyterhub bash /home/hadoop/scripts/bootstrap.sh. Я убедился, что файл sh находится в правильном месте.

Но если я скопирую файл bootstrap.sh внутри контейнера, а затем запусту тот же docker exec cmd, он будет работать нормально. Что мне здесь не хватает? Я пробовал с простым скриптом со следующими записями, но он выдает ту же ошибку:

#!/bin/bash
echo "Hello"

Док ясно говорит:

Ядра установлены в контейнере Docker. Самый простой способ Для этого создайте скрипт bash с помощью команд установки, сохраните его на главном узле, а затем воспользуйтесь командой sudo docker jupyterhub script_name команда для запуска скрипта в jupyterhub контейнер.

1 Ответ

1 голос
/ 03 апреля 2019

Команда docker exec запускает команду в пространствах имен контейнера. Одним из таких пространств имен является файловая система. Поэтому, если команда не является частью образа, записана непосредственно в контейнер, или вы смонтировали том хоста, чтобы отобразить каталог хоста в контейнер, вы не сможете выполнить его. Том хоста может выглядеть так:

docker run -v /host/scripts:/container/scripts -n your_container $your_image
docker exec -it your_container /container/scripts/test.sh

Этот том хоста может иметь одинаковый путь как на хосте, так и на контейнере.

Если это сценарий оболочки, вы можете использовать перенаправление ввода / вывода, например ::

docker exec -i $container_id /bin/bash <local_script.sh

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

Кроме этих сценариев, я не знаю, что вам сказать, кроме документации от AWS, которая выглядит неправильно.

...