我是码头工人的新手。我必须调用一个shell脚本,它通过docker容器接受命令行参数。 示例:我的shell脚本看起来像:
#!bin/bash
echo $1
Dockerfile是这样的:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
我不确定在运行容器时如何传递参数
我是码头工人的新手。我必须调用一个shell脚本,它通过docker容器接受命令行参数。 示例:我的shell脚本看起来像:
#!bin/bash
echo $1
Dockerfile是这样的:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
我不确定在运行容器时如何传递参数
当前回答
使用相同的file.sh
#!/bin/bash
echo $1
使用现有的Dockerfile构建映像:
docker build -t test .
使用abc或xyz或其他参数运行图像。
docker run -ti --rm test /file.sh abc
docker run -ti --rm test /file.sh xyz
其他回答
如果你想@build time运行它:
CMD /bin/bash /file.sh arg1
如果你想运行它@运行时:
ENTRYPOINT ["/bin/bash"]
CMD ["/file.sh", "arg1"]
然后在主壳层
docker build -t test .
docker run -i -t test
使用相同的file.sh
#!/bin/bash
echo $1
使用现有的Dockerfile构建映像:
docker build -t test .
使用abc或xyz或其他参数运行图像。
docker run -ti --rm test /file.sh abc
docker run -ti --rm test /file.sh xyz
使用file.sh中的这个脚本
#!/bin/bash
echo Your container args are: "$@"
还有这个Dockerfile
FROM ubuntu:14.04
COPY ./file.sh /
ENTRYPOINT ["/file.sh"]
你应该能够:
% docker build -t test .
% docker run test hello world
Your container args are: hello world
在Docker中,传递这类信息的正确方法是通过环境变量。
因此,使用相同的Dockerfile,将脚本更改为
#!/bin/bash
echo $FOO
构建完成后,使用以下docker命令:
docker run -e FOO="hello world!" test
另一种选择……
为了让它起作用
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