【问题标题】:Dockerfile - evaluate env variable at build timeDockerfile - 在构建时评估环境变量
【发布时间】:2018-01-15 14:49:53
【问题描述】:

因为我放入容器中的应用程序的 bin 名称可以更改(docker build 是较大构建的一部分,我很容易将正确的名称从一个构建传递到另一个构建)我想做这样的事情:

ENTRYPOINT ["$PATH_TO_BIN"]

但是由于没有 shell 来评估这通常会失败。理论上我可以去

ENTRYPOINT $PATH_TO_BIN

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

是否有可能在构建过程中使用 exec 形式并评估 args 或 env 变量(因此在运行时不需要 shell?)

【问题讨论】:

标签: docker dockerfile


【解决方案1】:

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

ARG PATH_TO_BIN

然后这样做:

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

documentation查看更多信息

【讨论】:

    【解决方案2】:

    这很有可能。问题是您尝试直接执行命令。相反,您需要做的是创建一个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 $@
    

    这也可以。

    【讨论】:

    • 这么少需要这么多?
    • 这只是一点点
    猜你喜欢
    • 2020-07-12
    • 2021-08-28
    • 2020-11-17
    • 2016-08-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2010-10-14
    相关资源
    最近更新 更多