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