2017-08-08 91 views
0

因为我放在容器中的应用程序的bin名称可能会更改(docker build是更大的构建的一部分,并且我很容易将正确的名称从一个构建传递到另一个构建)我想做这样的事情:Dockerfile - 在构建时评估env变量

ENTRYPOINT ["$PATH_TO_BIN"]

但因为没有外壳,以评估这通常会失败。从理论上讲,我可以去

ENTRYPOINT $PATH_TO_BIN

但在这种情况下做run的时候,我不能传递任何参数。

是它在某种程度上可以使用EXEC形式和生成过程中评估ARGS或ENV变量(所以没有必要在运行时的壳呢?)

+0

可能[我们可以在通过dockerfile构建docker镜像时通过cmd行传递ENV变量吗?](https://stackoverflow.com/questions/31198835/can-we-pass-env-variables-through-cmd-line-while -bui lding-a-docker-image-through) – MatTheWhale

回答

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 [email protected]" 
    elif [ ! -z $COMMAND ]; then 
     CMD="$CMD $COMMAND" 
    fi 

    echo "Executing - $CMD" 
    exec $CMD 
} 

_load [email protected] 

该脚本只是检查是否有环境变量$ENTRYPOINT$COMMAND传递,或两者都通过,或从码头运行命令通过。基于以下优先顺序运行命令

  • 入口点+运行参数 - 合并两组,并执行
  • 入口点+ COMMAND - 合并两组,并执行
  • MISSING $ COMMAND - 运行$入口点
  • MISSING $入口点 - 运行$ 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 [email protected] 

这也将更换工作。

+0

如此之少需要这么多? – korda

+0

这只是一点点 –

+0

@ korda,还添加了一个更简单的入口点版本 –

1

如果您正在使用最新版本的泊坞窗引擎,你可以在你的Dockerfile补充一点:

ARG PATH_TO_BIN 

,然后做到这一点:

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

多见于documentation