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 $@ 

这也是可行的。