【问题标题】:docker build with --build-arg with multiple argumentsdocker build with --build-arg 带有多个参数
【发布时间】:2017-07-06 22:44:42
【问题描述】:

根据documentation,可以为标志--build-arg 定义多个参数,但我不知道如何。我尝试了以下方法:

docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 number_of_replicas=2 --no-cache .

=> 这会返回一个错误。

我也试过了:

docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5,number_of_replicas=2 --no-cache .

=> 这会将一个变量number_of_shards 设置为值“5,number_of_replicas=2”

知道如何定义多个参数吗?

【问题讨论】:

    标签: docker build arguments


    【解决方案1】:

    很遗憾,我们也需要多个 ARG,它会导致多层并因此减慢构建速度,对于任何也想知道这一点的人来说,目前 there is no way 为每行设置多个 ARG。

    【讨论】:

    • 这可以与multi stage builds 结合使用以减少最终构建图像上的层数
    • 这并没有回答如何设置多个构建参数的问题。使用 buildkit,您不会看到正在执行的单独步骤,而使用经典构建,这些额外步骤不是文件系统层。
    • 这个答案可能会产生误导。真实的是,没有办法在一行中设置多个参数。但是,绝对支持多个参数。
    • 澄清声明
    【解决方案2】:

    如果您想从特定文件自动传递构建参数,您可以这样做:

    docker build  $(cat .my-env-file-name | while read line; do out+="--build-arg $line"; done; echo $out; out="") .
    

    【讨论】:

      【解决方案3】:

      如果你想在构建过程中使用环境变量。让我们说设置用户名和密码。

      username= Ubuntu
      password= swed24sw
      

      Dockerfile

      FROM ubuntu:16.04
      ARG SMB_PASS
      ARG SMB_USER
      # Creates a new User
      RUN useradd -ms /bin/bash $SMB_USER
      # Enters the password twice.
      RUN echo "$SMB_PASS\n$SMB_PASS" | smbpasswd -a $SMB_USER
      

      终端命令

      docker build --build-arg SMB_PASS=swed24sw --build-arg SMB_USER=Ubuntu . -t IMAGE_TAG

      【讨论】:

      • 请注意,这会使使用 docker history 命令的 docker 映像中的秘密值可见。
      【解决方案4】:

      在每个参数中使用--build-arg

      如果您要传递两个参数,请在每个参数中添加--build-arg,例如:

      docker build \
      -t essearch/ess-elasticsearch:1.7.6 \
      --build-arg number_of_shards=5 \
      --build-arg number_of_replicas=2 \
      --no-cache .
      

      【讨论】:

      • 感谢您解决这个问题。上面的--help 尤其具有误导性:--build-arg list。这不是一个列表!
      【解决方案5】:

      pl_rock 的上述回答是正确的,我唯一要补充的是,如果不是,您将无法访问 Dockerfile 中的 ARG。所以如果你在做

      docker build -t essearch/ess-elasticsearch:1.7.6 --build-arg number_of_shards=5 --build-arg number_of_replicas=2 --no-cache .
      

      然后你应该在 Dockerfile 中添加

      ARG number_of_replicas
      ARG number_of_shards
      

      我遇到了这个问题,所以我希望将来能帮助别人(我自己)。

      【讨论】:

      • 你也帮助了我,非常感谢。让我只补充一点,ARGS 必须在FROM 之后声明
      • 哇,谢谢!在docs.docker.com/engine/reference/commandline/build/… 中甚至没有提到使用ARG 并且--build-arg 对我来说没有ARG 是没用的
      • 在 FROM... 之前对我也没用 :-/
      猜你喜欢
      • 2018-06-27
      • 2021-03-06
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2015-05-13
      • 2019-12-30
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多