这很有可能。问题是您尝试直接执行命令。相反,您需要做的是创建一个entrypoint.sh 并让它执行。该脚本可以根据环境变量确定它需要做什么。
考虑下面的 Dockerfile
FROM centos:7.2.1511
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["this","is", "tarun"]
entrypoint.sh的内容如下
#!/usr/bin/env sh
_load() {
CMD=""
if [ ! -z "$ENTRYPOINT" ]; then
CMD=$ENTRYPOINT
fi
if [ "$#" -gt 0 ]; then
CMD="$CMD $@"
elif [ ! -z $COMMAND ]; then
CMD="$CMD $COMMAND"
fi
echo "Executing - $CMD"
exec $CMD
}
_load $@
脚本只检查环境变量$ENTRYPOINT 或$COMMAND 是否已通过,或两者均已通过,或来自 docker run 的命令是否已通过。根据以下优先级顺序运行命令
- ENTRYPOINT + RUN PARAMETERS - 结合两者并执行
- ENTRYPOINT + COMMAND - 结合两者并执行
- 缺少 $COMMAND - 运行 $ENTRYPOINT
- 缺少 $ENTRYPOINT - 运行 $COMMAND
现在来测试一下
$ docker run -e ENTRYPOINT=/bin/echo test my name "is XYZ"
Executing - /bin/echo my name is XYZ
my name is XYZ
脚本可能不是 100% 完美,但我创建它只是为了展示这个想法
如果您需要一个简单的entrypoint.sh,那么您甚至可以将其替换为以下内容
exec $ENTRYPOINT $@
这也可以。