Dockerfile – 在构build时评估envvariables
因为我放在容器中的应用程序的bin名称可能会改变(docker build是更大的构build的一部分,我很容易将正确的名称从一个构build传递到另一个构build)我想要做这样的事情:
ENTRYPOINT ["$PATH_TO_BIN"]
但由于没有壳来评估这通常会失败。 理论上我可以去
ENTRYPOINT $PATH_TO_BIN
但在这种情况下,我不能在run
时传递任何参数。
在构build过程中是否可以使用exec表单并评估args或envvariables(因此在运行时不需要shell)
如果您使用的是最新版本的Docker Engine,则可以将其添加到Dockerfile中:
ARG PATH_TO_BIN
然后这样做:
docker build --build-arg PATH_TO_BIN=/usr/bin/
请参阅文档
这很可能。 问题是你试图直接执行命令。 相反,你需要做的是创build一个entrypoint.sh
并让它执行。 该脚本可以根据环境variables确定需要执行的操作。
考虑下面的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 $@
该脚本不做任何事情,而是检查是否传递了一个环境variables$ENTRYPOINT
或$COMMAND
,或者两者都通过了,或者是来自docker run的命令通过了。 根据以下优先顺序,它运行命令
- 入口点+运行参数 – 组合并执行
- 进入点+命令 – 合并和执行
- MISSING $ COMMAND – 运行$ ENTRYPOINT
- MISSING $ ENTRYPOINT – 运行$ COMMAND
现在来testing它
$ docker run -e ENTRYPOINT=/bin/echo test my name "is XYZ" Executing - /bin/echo my name is XYZ my name is XYZ
脚本可能不是100%完美的,但我只是创build它来展示这个想法
如果你需要一个简单的entrypoint.sh
那么你甚至可以用下面的内容replace它
exec $ENTRYPOINT $@
这也是可行的。