Dockerfile - 在构建时评估env变量

时间:2017-08-08 07:04:24

标签: docker dockerfile

因为放入容器的app I的bin名称可以更改(docker build是更大版本的一部分,并且我很容易将正确的名称从一个版本传递到另一个版本)我想做某事像这样:

ENTRYPOINT $PATH_TO_BIN

但是由于没有shell来评估,这通常会失败。从理论上讲,我可以选择

run

但在这种情况下,我在执行FragmentActivity时无法传递任何参数。

是否有可能在构建期间使用exec表单并评估args或env变量(因此在运行时不需要shell?)

2 个答案:

答案 0 :(得分:1)

如果您使用的是最新版本的Docker Engine,可以在Dockerfile中添加:

ARG PATH_TO_BIN

然后执行此操作:

docker build --build-arg PATH_TO_BIN=/usr/bin/

documentation

了解详情

答案 1 :(得分:0)

这很有可能。问题是你试图直接执行命令。相反,你需要做的是,创建一个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 - 结合两者并执行
  • MISSING $ COMMAND - 运行$ ENTRYPOINT
  • MISSING $ 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 $@

这也行得通。