如何在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运行:)
- 无法连接到docker公布端口的tftp
- 在Docker容器ASP.NET应用程序中集成Windows身份validation
- 如何挤压Dockerfiles?
- Ruby&Redis / Skidekiq URI :: InvalidURIError:redisscheme不接受registry部分:bsc_redis:6379(或者是错误的主机名?)
- 如何在intellijdocker集装箱中开发?
- GNS3上的networking自动化模块错误
- SolrCloud持久卷权限问题使用Kubernetes
- 无法使用cqlsh连接到cassandra docker
- 如何在高山linuxdocker集装箱上运行crond和vsftpd?