如何在Docker构build期间使构buildarg成为强制性的?

docker build过程中,是否有任何方法可以构build参数? 如果参数丢失,预期的行为将是构build失败。

例如,对于以下Dockerfile:

 FROM ubuntu ARG MY_VARIABLE ENV MY_VARIABLE $MY_VARIABLE RUN ... 

我希望在使用ARG MY_VARIABLE docker build -t my-tag .时,构build在ARG MY_VARIABLE时失败docker build -t my-tag . 并通过docker build -t my-tag --build-arg MY_VARIABLE=my_value .时通过docker build -t my-tag --build-arg MY_VARIABLE=my_value .

有什么方法可以实现这种行为? 设置一个默认值并不是真的在我的情况下。

(我在darwin/amd64上运行Docker 1.11.1 。)

编辑 :我可以想到的一种方法是运行一个命令失败时, MY_VARIABLE为空,例如:

 FROM ubuntu ARG MY_VARIABLE RUN test -n "$MY_VARIABLE" ENV MY_VARIABLE $MY_VARIABLE RUN ... 

但对于眼前的问题,这似乎不是一个非常习惯的解决办法。

你可以做这样的事情…

  FROM ubuntu:14.04 ONBUILD ARG MY_VARIABLE ONBUILD RUN if [ -z "$MY_VARIABLE" ]; then echo "NOT SET - ERROR"; exit 1; else : ; fi 

然后docker build -t my_variable_base .

然后根据这个build立你的图像…

 FROM my_variable_base ... 

它不是超级干净的,但至less它把“bleh”东西抽象到基本的形象。

我使用“RUN test -n”testing了原始(编辑)文章中提到的@konradstrack …似乎要求将variables作为docker build命令的构build时间parameter passing

 FROM ubuntu ARG MY_VARIABLE RUN test -n "$MY_VARIABLE" ENV MY_VARIABLE $MY_VARIABLE 

你也可以使用shell参数扩展来实现这一点。

假设您的强制构build参数名为MANDATORY_BUILD_ARGUMENT ,并且您希望将其设置为非空,那么您的Dockerfile可能如下所示:

 FROM debian:stretch-slim MAINTAINER Evel Knievel <evel@kniev.el> ARG MANDATORY_BUILD_ARGUMENT RUN \ # Check for mandatory build arguments : "${MANDATORY_BUILD_ARGUMENT:?Build argument needs to be set and non-empty.}" \ # Install libraries && apt-get update \ && apt-get install -y \ cowsay \ fortune \ # Cleanup && apt-get clean \ && rm -rf \ /var/lib/apt/lists/* \ /var/tmp/* \ /tmp/* \ CMD ["/bin/bash", "-c", "/usr/games/fortune | /usr/games/cowsay"] 

当然,你也可以使用构build参数来实现某些function,不过我仍然build议构build这个Dockerfile并将其作为testing运行:)