How to make a build arg mandatory during Docker bu

2020-02-17 00:33发布

Is there any way to make a build argument mandatory during docker build? The expected behaviour would be for the build to fail if the argument is missing.

For example, for the following Dockerfile:

FROM ubuntu

ARG MY_VARIABLE
ENV MY_VARIABLE $MY_VARIABLE

RUN ...

I would like the build to fail at ARG MY_VARIABLE when built with docker build -t my-tag . and pass when built with docker build -t my-tag --build-arg MY_VARIABLE=my_value ..

Is there any way to achieve that behaviour? Setting a default value doesn't really do the trick in my case.

(I'm running Docker 1.11.1 on darwin/amd64.)

EDIT: One way of doing that I can think of is to run a command that fails when MY_VARIABLE is empty, e.g.:

FROM ubuntu

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

RUN ...

but it doesn't seem to be a very idiomatic solution to the problem at hand.

标签: docker
5条回答
放荡不羁爱自由
2楼-- · 2020-02-17 00:54

You could do something like this...

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

Then docker build -t my_variable_base .

Then build your images based on this...

FROM my_variable_base
...

It's not super clean, but at least it abstracts the 'bleh' stuff away to the base image.

查看更多
神经病院院长
3楼-- · 2020-02-17 01:09

I cannot comment yet because I do not have 50 reputation, but I would like to add onto @Jan Nash's solution because I had a little difficulty getting it to work with my image.

If you copy/paste @Jan Nash's solution, it will work and spit out the error message that the build argument is not specified.

What I want to add

When I tried getting it to work on a CentOS 7 image (centos:7), Docker ran the RUN command without erroring out.

Solution

Ensure that you're executing the RUN command with the bash shell.

RUN ["/bin/bash", "-c", ": ${MYUID:?Build argument needs to be set and not null.}"]

I hope that helps for future incoming people. Otherwise, I believe @Jan Nash's solution is just brilliant.

查看更多
该账号已被封号
4楼-- · 2020-02-17 01:12

You can also use shell parameter expansion to achieve this.

Let's say your mandatory build argument is called MANDATORY_BUILD_ARGUMENT, and you want it to be set and non-empty, your Dockerfile could look like this:

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"]

Of course, you would also want to use the build-argument for something, unlike I did, but still, I recommend building this Dockerfile and taking it for a test-run :)

查看更多
男人必须洒脱
5楼-- · 2020-02-17 01:13

I tested with RUN test -n <ARGvariablename> what @konradstrack mentioned in the original (edit) post... that seems do the job of mandating the variable to be passed as the build time argument for the docker build command:

FROM ubuntu

ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE
查看更多
淡お忘
6楼-- · 2020-02-17 01:13

Another simple way:

RUN test -n "$MY_VARIABLE" || (echo "MY_VARIABLE  not set" && false)
查看更多
登录 后发表回答