在docker build
期间,是否有任何方法可以强制使用构建参数?如果缺少参数,预期的行为将是构建失败。
例如,对于以下Dockerfile:
FROM ubuntu
ARG MY_VARIABLE
ENV MY_VARIABLE $MY_VARIABLE
RUN ...
我希望使用docker build -t my-tag .
构建时,构建在ARG MY_VARIABLE
处失败,使用docker build -t my-tag --build-arg MY_VARIABLE=my_value .
构建时通过。
有什么方法可以实现这种行为吗?在我的例子中,设置一个默认值并不能真正达到这个目的。
(我在darwin/amd64
上运行Docker 1.11.1
。)
EDIT:我能想到的一种方法是运行一个当MY_VARIABLE
为空时失败的命令,例如:
FROM ubuntu
ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE
RUN ...
但这似乎不是解决当前问题的一个非常惯用的方法。
8条答案
按热度按时间au9on6nz1#
我用
RUN test -n <ARGvariablename>
测试了@konradstrack在原始(编辑)帖子中提到的内容......它似乎完成了强制将变量作为docker build
命令的构建时参数传递的工作:mklgxw1f2#
您也可以使用shell parameter expansion来实现这一点。
假设您的强制构建参数名为
MANDATORY_BUILD_ARGUMENT
,并且您希望它被设置为非空,则您的Dockerfile可能如下所示:当然,您也可能希望使用构建参数,这与我所做的不同,但我仍然建议构建此Dockerfile并对其进行测试运行:)
编辑
正如在@Jeffrey Wen的回答中提到的,为了确保在
centos:7
图像上(可能还有其他图像,我承认我没有在stretch-slim
以外的其他图像上测试过):确保您正在使用bash shell执行RUN命令。
RUN ["/bin/bash", "-c", ": ${MYUID:?Build argument needs to be set and not null.}"]
mf98qq943#
另一个简单道:
5m1hhzi44#
很久以前,我需要引入一个必需的(强制性的)
ARG
,为了更好地使用用户体验,在开始时包括检查:但是,这会破坏初始
MY_ARG
之后每一层的构建缓存,因为MY_ARG=VALUE
会在之后的每个RUN
命令之前。每当我改变
MY_ARG
时,它最终会重建整个映像,而不是只重新运行最后的RUN
命令。为了恢复缓存,我将我的构建更改为多阶段构建:
MY_ARG
并检查其存在性。ARG MY_ARG
。由于第二阶段中的
ARG MY_ARG
是在它被使用 * 之前 * 声明的,因此该阶段中的所有先前步骤都不受影响,因此缓存正确。k4aesqcs5#
你可以这样做...
然后
docker build -t my_variable_base .
然后在此基础上构建图像...
它不是超级干净,但至少它把“bleh”的东西抽象到了基础图像中。
kknvjkwl6#
我还不能发表评论,因为我没有50的声望,但我想补充到@扬纳什的解决方案,因为我有一点困难,让它与我的形象工作。
如果您复制/粘贴@Jan Nash的解决方案,它将工作,并显示未指定构建参数的错误消息。
我想补充的是
当我试图让它在CentOS 7映像(centos:7)上工作时,Docker运行了
RUN
命令**,没有**出错。解决方案
确保您正在使用bash shell执行
RUN
命令。RUN ["/bin/bash", "-c", ": ${MYUID:?Build argument needs to be set and not null.}"]
我希望这对未来的新人有帮助。否则,我相信“扬·纳什的解决方案是非常棒的。”
hwazgwia7#
如果有人在寻找
docker compose build
的解决方案,我使用了强制变量。运行
docker compose build
后:Support for Required Environment variablesCompose Environment Variables显示器
au9on6nz8#
这些答案对我都不起作用。我想要
${MY_VARIABLE:?}
,但不想打印任何东西,所以我这样做了:成功时不会打印任何内容。如果出现错误,您会看到以下内容,这是一个足够好的错误:
运行测试时出错-n ${MY_VARIABLE:?}
/bin/sh:我的变量:参数未设置或为空
执行程式无法执行[/bin/sh -c test -n ${MY_VARIABLE:?}]:〉退出代码:2