假设我有一个shell脚本的入口点,因为我想在dockerfile中使用一些条件。有办法做这样的事情吗?
ENTRYPOINT["./entry.sh","lambda name"]
入口内部.sh
#!/usr/bin/env bash
lambda_name=$1
echo "$lambda_name"
if [ "$lambda_name" = "a.handler" ]; then
CMD [ "a.handler" ]
elif [ "$lambda_name" = "b.handler" ];then
CMD [ "b.handler" ]
else
echo "not found"
fi
首先,您不需要这种复杂情况。
为什么不这样呢?
#!/usr/bin/env bash
lambda_name=$1
echo "$lambda_name"
if [ "$lambda_name" = "a.handler" ]; then
./a.handler
elif [ "$lambda_name" = "b.handler" ];then
./b.handler
else
echo "not found"
fi
在你的脚本中,你也可以使用类似的东西
exec "$@"
在脚本的末尾。这将运行你所有的论点。
ENTRYPOINT
是主容器进程。当您docker run
构建的图像时执行;此时运行任何其他Dockerfile指令都为时已晚。
特别是,ENTRYPOINT
会将图像的CMD
(或Composecommand:
或docker run image-name
之后的备用命令(作为参数传递给它,它可以用它做任何想做的事情。所以在这一点上,你真的不需要";设置容器的命令";,您可以执行您可能想要运行的任何命令。
#!/bin/sh
case "$1" in
a.handler) a.handler ;;
b.handler) b.handler ;;
*)
echo "$1 not found" >&2
exit 1
;;
esac
有了这种设置,一个相当常见的Docker模式就是将传递的任何内容作为参数,并在入口点脚本结束时运行。
#!/bin/sh
# ... do any startup-time setup required here ...
exec "$@"
这与问题中显示的内容相匹配:如果第一个参数是a.handler
,则运行该命令,依此类推