Как передать аргументы Shell Script через прогон докеров
Я новичок в мире докеров. Я должен вызвать оболочку script, которая принимает аргументы командной строки через контейнер докеров.
Пример: Моя оболочка script выглядит следующим образом:
#!bin/bash
echo $1
Dockerfile выглядит следующим образом:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Я не уверен, как передать аргументы при запуске контейнера
Ответы
Ответ 1
Используйте тот же file.sh
#!bin/bash
echo $1
Создайте образ, используя существующий Dockerfile:
docker build -t test .
Запустите изображение с аргументами abc
или xyz
или что-то еще.
docker run -ti test /file.sh abc
docker run -ti test /file.sh xyz
Ответ 2
с этим script в file.sh
#!/bin/bash
echo Your container args are: "[email protected]"
и это Dockerfile
FROM ubuntu:14.04
COPY ./file.sh /
ENTRYPOINT ["/file.sh"]
CMD []
вы должны уметь:
% docker build -t test .
% docker run test hello world
Your container args are: hello world
Ответ 3
С Docker правильный способ передачи такого рода информации осуществляется через переменные среды.
Итак, с тем же файлом Docker, измените script на
#!/bin/bash
echo $FOO
После создания используйте следующую команду docker:
docker run -e FOO="hello world!" test
Ответ 4
То, что у меня есть, это файл сценария, который на самом деле работает вещи. Этот файл сценария может быть относительно сложным. Давайте назовем это "run_container". Этот скрипт принимает аргументы из командной строки:
run_container p1 p2 p3
Простой run_container может быть:
#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"
Что я хочу сделать, так это то, что после "закрепления" я хотел бы иметь возможность запустить этот контейнер с параметрами в командной строке Docker, например так:
docker run image_name p1 p2 p3
и запустить скрипт run_container с параметрами p1 p2 p3.
Это мое решение:
Dockerfile:
FROM docker.io/ubuntu
ADD run_container /
ENTRYPOINT ["/bin/bash", "-c", "/run_container \"[email protected]\"", "--"]
Ответ 5
Здесь есть несколько вещей, которые взаимодействуют:
-
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"
в качестве команды, запускаемой внутри вашего контейнера, не так хорошо, как хотелось бы. Смотрите таблицу здесь для получения дополнительной информации о том, как эти два варианта взаимодействуют
-
Опция shell -c
принимает только один аргумент. Все после этого передается как $1
, $2
и т.д. Этому единственному аргументу, но не во встроенный сценарий оболочки, если вы явно не передали аргументы. Т.е. /bin/sh -c "file.sh $1 $2" "arg1" "arg2"
будет работать, но /bin/sh -c "file.sh" "arg1" "arg2"
не будет, так как file.sh
будет быть вызванным без аргументов.
Собирая все это вместе, общий дизайн:
FROM ubuntu:14.04
COPY ./file.sh /
RUN chmod 755 /file.sh
# Note the json syntax on this next line is strict, double quotes, and any syntax
# error will result in a shell being used to run the line.
ENTRYPOINT ["file.sh"]
И затем вы запускаете это с:
docker run your_image arg1 arg2
Более подробно об этом на сайте:
Ответ 6
Если вы хотите запустить это время @build:
CMD /bin/bash /file.sh arg1
если вы хотите запустить его @run time:
ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]
Затем в оболочке хоста
docker build -t test .
docker run -i -t test
Ответ 7
Другой вариант...
Чтобы это работало
docker run -d --rm $IMG_NAME "bash:command1&&command2&&command3"
в докерфайле
ENTRYPOINT ["/entrypoint.sh"]
в entrypoint.sh
#!/bin/sh
entrypoint_params=$1
printf "==>[entrypoint.sh] %s\n" "entry_point_param is $entrypoint_params"
PARAM1=$(echo $entrypoint_params | cut -d':' -f1) # output is 1 must be 'bash' it will be tested
PARAM2=$(echo $entrypoint_params | cut -d':' -f2) # the real command separated by &&
printf "==>[entrypoint.sh] %s\n" "PARAM1=$PARAM1"
printf "==>[entrypoint.sh] %s\n" "PARAM2=$PARAM2"
if [ "$PARAM1" = "bash" ];
then
printf "==>[entrypoint.sh] %s\n" "about to running $PARAM2 command"
echo $PARAM2 | tr '&&' '\n' | while read cmd; do
$cmd
done
fi