代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

将arg传递到入口点

  •  1
  • Alexander Mills  · 技术社区  · 6 年前

    假设我在一个dockerfile里有这个:

    ARG FOO=1
    ENTRYPOINT ["docker.r2g", "run"]
    

    我用以下方法构建上述内容:

    docker build -t "$tag" --build-arg FOO="$(date +%s)" .
    

    有什么方法可以做到:

    ENTRYPOINT ["docker.r2g", "run", ARG FOO]  // something like this
    

    我想这个论点也可以通过 docker run 而不是在 docker build 阶段?

    2 回复  |  直到 6 年前
        1
  •  2
  •   VonC    6 年前

    你可以把arg和env结合在你的dockerfile中,正如我在“中提到的那样。” ARG or ENV, which one to use in this case? 他说:“这是一个很好的选择。”

    ARG FOO
    ENV FOO=${FOO}
    

    那样的话,你 docker.r2g 可以访问 ${FOO} 环境变量。

    我想这个论点也可以通过docker run来传递,而不是在docker build阶段?

    如果在运行时给foo一个值更合理,这也是可能的:

    docker run -e FOO=$(...) ...
    
        2
  •  1
  •   Alexander Mills    6 年前

    这个简单的方法对我很有用:

    FROM node:9
    # ...
    ENTRYPOINT dkr2g run "$dkr2g_run_args"
    

    然后我们用以下方法发射容器:

    docker run \
        -e dkr2g_run_args="$run_args" \
        --name "$container_name" "$tag_name"
    

    在将env变量扩展到命令行参数中时,可能会出现一些边缘情况问题,但大多数情况下都可以使用。

    入口点可以这样工作:

    ENTRYPOINT ["foo", "--bar", "$baz"]  # $baz will not be interpreted
    

    或者像这样:

    ENTRYPOINT foo --bar $baz
    

    不知道为什么后者不是首选——但env变量插值/解释只能使用后者。参见: How do I use Docker environment variable in ENTRYPOINT array?

    然而,一个更强大的方法 传递参数的方法是使用 $@ 而不是env变量。那么您应该做的是重写——使用 docker run 命令,就像这样:

    docker run --entrypoint="foo" <tag> --bar $@
    

    要学习如何正确重写入口点的正确语法,您必须查找它,当然,但一般来说,这很奇怪-您必须 --entrypoint="foo" 之前 标记名和的参数 --entrypoint ,请 之后 标签名。奇怪的。

    推荐文章