docker build with --build-arg 带有多个参数

Posted

技术标签:

【中文标题】docker build with --build-arg 带有多个参数【英文标题】:docker build with --build-arg with multiple arguments 【发布时间】: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”

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

【问题讨论】:

【参考方案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... 之前对我也没用 :-/

以上是关于docker build with --build-arg 带有多个参数的主要内容,如果未能解决你的问题,请参考以下文章

Pipeline build step with parameters

docker: "build" 需要 1 个参数。见'docker build --help'

Jenkins Android Build Error: FAILURE: Build failed with an exception

无法安装 gem,因为“nil:NilClass 的未定义方法 `invoke_with_build_args'”

Building a desktop application with Electron

Building Microservices with Spring Boot and Apache Thrift. Part 1 with servlet