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

Как передать аргументы Shell Script через прогон докеров

Я новичок в мире докеров. Я должен вызвать оболочку script, которая принимает аргументы командной строки через контейнер докеров. Пример: Моя оболочка script выглядит следующим образом:

#!bin/bash
echo $1

Dockerfile выглядит следующим образом:

FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh

Я не уверен, как передать аргументы при запуске контейнера

4b9b3361

Ответ 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

Здесь есть несколько вещей, которые взаимодействуют:

  1. docker run your_image arg1 arg2 заменит значение CMD на arg1 arg2. Это полная замена CMD, а не добавление дополнительных значений к нему. Вот почему вы часто видите, что docker run some_image/bin/bash для запуска оболочки bash в контейнере.

  2. Когда вы определили и значение ENTRYPOINT, и значение CMD, docker запускает контейнер, объединяя два и выполняя эту объединенную команду. Поэтому, если вы определили свою точку входа как file.sh, теперь вы можете запустить контейнер с дополнительными аргументами, которые будут переданы как аргументы в file.sh

  3. Точки ввода и команды в Docker имеют два синтаксиса: строковый синтаксис, который будет запускать оболочку, и синтаксис json, который будет выполнять exec. Оболочка полезна для обработки таких вещей, как перенаправление ввода-вывода, объединение нескольких команд (например, &&), подстановка переменных и т.д. Однако эта оболочка мешает обработке сигналов (если вы когда-либо видели 10-секундную задержку для остановка контейнера, это часто является причиной) и с объединением точки входа и команды вместе. Если вы определите свою точку входа как строку, она запустит /bin/sh -c "file.sh", что само по себе хорошо. Но если у вас есть команда, определенная как строка, вы увидите что-то вроде /bin/sh -c "file.sh"/bin/sh -c "arg1 arg2" в качестве команды, запускаемой внутри вашего контейнера, не так хорошо, как хотелось бы. Смотрите таблицу здесь для получения дополнительной информации о том, как эти два варианта взаимодействуют

  4. Опция 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