Запуск 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)
Как это сделать, не стесняйтесь спрашивать, не является ли сценарий непонятным.
Ответы
Ответ 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.
Ответ 5
Посмотрите также на точки входа. Вы сможете использовать несколько CMD
https://docs.docker.com/engine/reference/builder/#/entrypoint
Ответ 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