Я новичок в мире докеров. Мне нужно вызвать сценарий оболочки, который принимает аргументы командной строки через контейнер докера. Пример: мой сценарий оболочки выглядит так:
#!bin/bash
echo $1
Dockerfile выглядит так:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Я не уверен, как передавать аргументы при запуске контейнера
bash
shell
docker
command-line-arguments
Акаш Мехта
источник
источник
docker run -ti test /file.sh abc
. Я чувствую, что сценарий не запускается, потому что он должен бытьdocker run -ti test sh /file.sh abc
. sh или / bin / sh запустит его правильно.с этим скриптом в
file.sh
и это
Dockerfile
ты должен быть способен:
источник
ENTRYPOINT ./file.sh
chmod +x file.sh
установить флаг исполняемого файла.["/file.sh"]
и/file.sh
или даже[/file.sh]
В Docker правильный способ передавать такую информацию - через переменные среды.
Итак, с тем же файлом Dockerfile измените сценарий на
После сборки используйте следующую команду докера:
источник
Здесь взаимодействуют несколько вещей:
docker run your_image arg1 arg2
заменит значениеCMD
сarg1 arg2
. Это полная замена CMD, без добавления к нему дополнительных значений. Вот почему вы часто видитеdocker run some_image /bin/bash
запуск оболочки bash в контейнере.Когда у вас определены значения ENTRYPOINT и CMD, docker запускает контейнер, объединяя их и выполняя эту объединенную команду. Итак, если вы определите свою точку входа как
file.sh
, теперь вы можете запустить контейнер с дополнительными аргументами, которые будут переданы как аргументы вfile.sh
.Точки входа и команды в docker имеют два синтаксиса: строковый синтаксис, который запускает оболочку, и синтаксис json, который выполняет exec. Оболочка полезна для обработки таких вещей, как перенаправление ввода-вывода, объединение нескольких команд вместе (например,
&&
), подстановка переменных и т. Д. Однако эта оболочка мешает обработке сигналов (если вы когда-нибудь видели 10-секундную задержку для остановки контейнер, это часто является причиной) и с объединением точки входа и команды вместе. Если вы определите свою точку входа как строку, она будет работать/bin/sh -c "file.sh"
, что само по себе нормально. Но если у вас есть команда, определенная как строка, вы увидите что-то вроде того,/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
что команда запускается внутри вашего контейнера, что не так хорошо. См. Таблицу здесь, чтобы узнать, как взаимодействуют эти два варианта.Параметр оболочки
-c
принимает только один аргумент. Все, что после этого, будет передано как$1
,$2
и т.д. в этот единственный аргумент, но не во встроенный сценарий оболочки, если вы явно не передали аргументы. Т.е./bin/sh -c "file.sh $1 $2" "arg1" "arg2"
будет работать, но/bin/sh -c "file.sh" "arg1" "arg2"
неfile.sh
будет, поскольку будет вызываться без аргументов.Собирая все это вместе, общий дизайн таков:
И затем вы запускаете это с помощью:
Подробнее об этом можно узнать по адресу:
источник
["bash", "--login", "-c"]
получить источник / etc / profile в образе, но позже мне стало интересно, почему никакие аргументы не будут переданы в сценарий оболочки, переданный в docker run ... Ваш ответ прояснил это, спасибо !У меня есть файл сценария, который действительно запускает вещи. Этот файл сценария может быть относительно сложным. Назовем его run_container. Этот сценарий принимает аргументы из командной строки:
Простой run_container может быть:
Что я хочу сделать, так это после "стыковки" этого я хотел бы иметь возможность запускать этот контейнер с параметрами в командной строке докера следующим образом:
и запустить сценарий run_container с параметрами p1 p2 p3.
Это мое решение:
Dockerfile:
источник
ENTRYPOINT
массиве на"/run_container \"$@\""
аргументы, содержащие пробелы, обрабатываются правильно (например,docker run image_name foo 'bar baz' quux
).Если вы хотите запустить его @build time:
если вы хотите запустить его @ время выполнения:
Затем в оболочке хоста
источник
ENTRYPOINT
- хороший ответ для OP, которому, как мне кажется, нужна среда выполнения, но если вам действительно нужны переменные времени сборки, этот ответ просто не работает. ИспользуйтеARG
иdocker build --build-arg
docs.docker.com/engine/reference/builder/#argДругой вариант...
Чтобы это работало
в dockerfile
в entrypoint.sh
источник