Подтвердить что ты не робот

Запуск script внутри контейнера докера с помощью оболочки script

Я новичок в технологии Docker, я пытаюсь создать оболочку script для настройки контейнера докеров, мой файл script выглядит следующим образом

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

Запуск этого файла script приведет к запуску контейнера в недавно вызванном bash.

Теперь мне нужно запустить файл script (test.sh), который уже находится внутри контейнера из приведенной выше оболочки script. (например: cd/path/to/test.sh &././test.sh) Как это сделать, не стесняйтесь спрашивать, не является ли сценарий непонятным.

4b9b3361

Ответ 1

Вы можете запустить команду в запущенном контейнере с помощью docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:

docker exec mycontainer /path/to/test.sh

И для запуска из сеанса bash:

docker exec -it mycontainer /bin/bash

И оттуда вы можете запустить свой script или что угодно.

Ответ 2

Предполагая, что ваш контейнер докеров загружен и запущен, вы можете запускать команды как:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"

Ответ 3

Я искал ответ для этого же вопроса и нашел ENTRYPOINT в решении Dockerfile для меня.

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

Теперь скрипты выполняются при запуске контейнера, и я получаю приглашение bash после выполнения сценариев.

Ответ 4

Вы также можете смонтировать локальный каталог в ваш образ докера и создать скрипт в вашем .bashrc. Не забывайте, что скрипт должен состоять из функций, если вы не хотите, чтобы он выполнялся в каждой новой оболочке. (Это устарело, см. Уведомление об обновлении.)

Я использую это решение, чтобы иметь возможность обновить скрипт за пределами экземпляра докера. Таким образом, мне не нужно повторно запускать изображение, если происходят изменения, я просто открываю новую оболочку. (Избавился от повторного открытия оболочки - см. Уведомление об обновлении)

Вот как вы привязываете свой текущий каталог:

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

Теперь ваш текущий каталог привязан к /scripts вашего экземпляра Docker.

(Устаревший). Чтобы сохранить изменения .bashrc зафиксируйте ваш рабочий образ с помощью этой команды:

docker commit $container_id $my_docker_build

Обновить

Чтобы решить эту проблему, чтобы открыть новую оболочку для каждого изменения, я делаю следующее:

В самом dockerfile я добавляю RUN echo "/scripts/bashrc" >/root/.bashrc". Внутри zshrc я экспортирую в каталог scripts в путь. Каталог scripts теперь содержит несколько файлов вместо одного. Теперь я могу напрямую вызывать все скрипты, не открывая вложенную оболочку при каждом изменении.

Кстати, вы можете определить файл истории за пределами вашего контейнера тоже. Таким образом, нет необходимости совершать изменения в bash.

Ответ 6

Если вы хотите запустить ту же команду в нескольких экземплярах, вы можете сделать это:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done