Я пытаюсь создать сценарий оболочки для настройки контейнера докеров. Мой файл сценария выглядит так:
#!bin/bash
docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash
Запуск этого файла сценария запустит контейнер во вновь вызванном bash.
Теперь мне нужно запустить файл сценария (test.sh), который уже находится внутри контейнера из указанного выше сценария оболочки. (Например: cd /path/to/test.sh && ./test.sh) Как это сделать?
WORKDIR
иCMD
?Ответы:
Вы можете запустить команду в работающем контейнере, используя
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
:docker exec mycontainer /path/to/test.sh
И для запуска из сеанса bash:
docker exec -it mycontainer /bin/bash
Оттуда вы можете запустить свой скрипт.
источник
docker exec -i mycontainer bash < mylocal.sh
Это читает локальный скрипт хоста и запускает его внутри контейнера. Вы можете сделать это с другими вещами (например, с файлами .tgz, передаваемыми по конвейеру в tar) - просто используйте '-i' для передачи в стандартный ввод процесса контейнера.Get-Content mylocal.sh | docker exec -i mycontainer bash
. Я не знаю, работает ли это.Предполагая, что ваш док-контейнер запущен и работает, вы можете запускать команды как:
docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
источник
/bin/sh -c "cmd1; cmd2; ...; cmdn"
) в качестве значения переменной оболочки? Я спрашиваю, потому что «docker run», кажется, ожидает одной команды и отдельных аргументов без кавычек, а не строки в кавычках.cmd1
мне нужно передать весь цикл for, но он ожидает;
после оператора цикла и оператора do . Как я могу запустить весь для цикла как одной команды , т.е.cmd1
? Является ли это возможным?Я искал ответ на тот же вопрос и нашел для себя ENTRYPOINT в решении Dockerfile .
Dockerfile
Теперь скрипты выполняются, когда я запускаю контейнер, и я получаю приглашение bash после того, как скрипты были выполнены.
источник
Вы также можете смонтировать локальный каталог в свой образ докера и создать скрипт в своем
.bashrc
. Не забывайте, что сценарий должен состоять из функций, если вы не хотите, чтобы он выполнялся в каждой новой оболочке. (Это устарело, см. Уведомление об обновлении.)Я использую это решение, чтобы иметь возможность обновлять скрипт вне экземпляра докера. Таким образом, мне не нужно повторно запускать изображение в случае изменений, я просто открываю новую оболочку. (Избавился от повторного открытия оболочки - см. Уведомление об обновлении)
Вот как вы привязываете свой текущий каталог:
docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
Теперь ваш текущий каталог привязан к
/scripts
вашему экземпляру докера.(Устарело) Чтобы сохранить
.bashrc
изменения, зафиксируйте рабочий образ с помощью этой команды:docker commit $container_id $my_docker_build
Обновить
Чтобы решить проблему, чтобы открывать новую оболочку для каждого изменения, я сейчас делаю следующее:
В самом dockerfile добавляю
RUN echo "/scripts/bashrc" > /root/.bashrc"
. Внутриzshrc
я экспортирую директорию скриптов по пути. Каталог скриптов теперь содержит несколько файлов вместо одного. Теперь я могу напрямую вызывать все сценарии, не открывая вспомогательную оболочку при каждом изменении.Кстати, вы также можете определить файл истории за пределами вашего контейнера. Таким образом, больше не нужно фиксировать изменение bash.
источник
Если вы не хотите (или имеете) работающий контейнер, вы можете вызвать свой скрипт напрямую с помощью
run
команды.Удалите итеративные
-i -t
аргументы tty и используйте это:Это будет (не тестировалось) также работать для других скриптов:
источник
Также обратите внимание на точки входа. Вы сможете использовать несколько CMD https://docs.docker.com/engine/reference/builder/#/entrypoint
источник
Если вы хотите запустить одну и ту же команду в нескольких экземплярах, вы можете сделать это:
for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
источник