如何通过docker run将参数传递给Shell Script

时间:2015-09-22 21:53:55

标签: bash shell docker command-line-arguments

我是码头工人世界的新手。我必须调用一个shell脚本,该脚本通过docker容器获取命令行参数。 例如:我的shell脚本如下:

#!bin/bash
echo $1

Dockerfile如下所示:

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

我不确定如何在运行容器时传递参数

7 个答案:

答案 0 :(得分:99)

file.sh

中使用此脚本
#!/bin/bash
echo Your container args are: "$@"

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

答案 1 :(得分:46)

使用Docker,传递此类信息的正确方法是通过环境变量。

因此,使用相同的Dockerfile,将脚本更改为

#!/bin/bash
echo $FOO

构建后,使用以下docker命令:

docker run -e FOO="hello world!" test

答案 2 :(得分:43)

使用相同的file.sh

#!bin/bash
echo $1

使用现有的Dockerfile构建映像:

docker build -t test .

使用参数abcxyz或其他内容运行图像。

docker run -ti test /file.sh abc

docker run -ti test /file.sh xyz

答案 3 :(得分:16)

我所拥有的是一个实际运行的脚本文件。此脚本文件可能相对复杂。我们称之为“run_container”。此脚本从命令行获取参数:

stackOfBoxes(boxes, n)

一个简单的run_container可能是:

run_container p1 p2 p3

我想要做的是,在“停靠”之后,我希望能够使用docker命令行上的参数启动此容器,如下所示:

#!/bin/bash
echo "argc = ${#*}"
echo "argv = ${*}"

并使用p1 p2 p3作为参数运行run_container脚本。

这是我的解决方案:

Dockerfile:

docker run image_name p1 p2 p3

答案 4 :(得分:11)

这里有几件事相互作用:

  1. docker run your_image arg1 arg2CMD的值替换为arg1 arg2。这是对CMD的完全替代,没有附加更多的值。这就是为什么您经常看到docker run some_image /bin/bash在容器中运行bash shell的原因。

  2. 同时定义了ENTRYPOINT和CMD值时,docker通过将两者串联并运行该串联命令来启动容器。因此,如果您将入口点定义为file.sh,则现在可以运行带有其他args的容器,这些args将作为args传递给file.sh

  3. docker中的
  4. Entrypoints和Commands具有两种语法,一个将启动shell的字符串语法,以及一个将执行exec的json语法。该外壳程序对于处理IO重定向,将多个命令链接在一起(以及类似&&,变量替换等)很有用。但是,该外壳程序会妨碍信号处理(如果您曾经看过停止容器需要10秒钟的延迟,这通常是原因),并将入口点和命令连接在一起。如果将入口点定义为字符串,则它将运行/bin/sh -c "file.sh",仅此一项就可以。但是,如果您也有一个定义为字符串的命令,那么在容器内启动该命令时,您会看到类似/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"的信息,效果不是很好。参见the table here for more on how these two options interact

  5. shell -c选项仅接受一个参数。之后的所有内容都将作为$1$2等传递给该单个参数,但不会传递给嵌入式Shell脚本,除非您显式传递了args。即/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

对此有更多细节:

答案 5 :(得分:4)

如果你想运行@build time:

' First
Parameters!EventIDs.Value(0)
Parameters!EventIDs.Label(0)

' Second
Parameters!EventIDs.Value(1)
Parameters!EventIDs.Label(1)

' And so on

如果你想运行它@run time:

CMD /bin/bash /file.sh arg1

然后在主机shell中

ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]

答案 6 :(得分:0)

另一个选择...

要使其生效

docker run -d --rm $IMG_NAME "bash:command1&&command2&&command3"

在dockerfile中

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