ChatGPT解决这个技术问题 Extra ChatGPT

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

根据 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”

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


F
Flynn Hou

对每个参数使用 --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。这不是清单!
也许它已被弃用...我不断收到 "docker build" requires exactly 1 argument.
J
Javier Perez

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

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


你也帮助了我,所以谢谢。让我补充一点,必须在 FROM 之后声明 ARGS
哇谢谢!在 docs.docker.com/engine/reference/commandline/build/… 中甚至没有提到使用 ARG,而且如果没有 ARG--build-arg 对我来说毫无用处
在 FROM... 之前对我也没用 :-/
F
Fakabbir Amin

如果要在构建期间使用环境变量。让我们说设置用户名和密码。

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 映像中的机密值可见。
v
v1adko

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


这可以与 multi stage builds 结合使用以减少最终构建图像上的层数
这并没有回答如何设置多个构建参数的问题。使用 buildkit,您不会看到正在执行的单独步骤,而使用经典构建,这些附加步骤不是文件系统层。
这个答案可能会产生误导。真实的是,没有办法在一行中设置多个参数。但是,绝对支持多个参数。
澄清了声明
ARG 指令不会在现代 Docker 中创建新层。 docs.docker.com/develop/develop-images/…
C
Clément Faure

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

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

我不知道为什么,但如果你在命令替换 $() 周围加上引号会导致 docker build 中断。它失去了 '=value' 部分。这让我在这里发疯了一段时间!知道为什么吗?
get_build_args() { for build_arg in "${BUILD_ARGS[@]}"; do out+="--build-arg $build_arg " done echo -n "$out" } 我写这个假设 BUILD_ARGS 是一个包含元素 ARG_NAME=VALUE 的数组。它运作良好,当我回显输出时,它就在那里。但是,当我替换为 docker build 时,如果我在它周围加上引号,那么它就会中断。真的很困惑
例如: build_args=`get_build_args` echo $build_args echo "$build_args" docker build $build_args 。搬运工构建“$build_args”。
N
Ngstigator

使用 xargs 从文件传入构建参数的方法如下:

cat .MY_ENV_FILE | xargs printf -- '--build-arg %s\n' | xargs docker build -t MY_TAG .

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review