2016-07-18 190 views
13

Esiste un modo per rendere obbligatorio un argomento di costruzione durante docker build? Il comportamento previsto sarebbe che la compilazione fallisse se manca l'argomento.Come rendere obbligatorio un argomento di build durante la creazione di Docker?

Ad esempio, per i seguenti Dockerfile:

FROM ubuntu 

ARG MY_VARIABLE 
ENV MY_VARIABLE $MY_VARIABLE 

RUN ... 

vorrei che la build per riuscire a ARG MY_VARIABLE quando costruito con docker build -t my-tag . e passare quando costruito con docker build -t my-tag --build-arg MY_VARIABLE=my_value ..

Esiste un modo per ottenere questo comportamento? L'impostazione di un valore predefinito non è davvero un trucco nel mio caso.

(sto correndo Docker 1.11.1 su darwin/amd64.)

EDIT: Un modo di fare che mi viene in mente è quello di eseguire un comando che fallisce quando MY_VARIABLE è vuota, ad esempio:

FROM ubuntu 

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

RUN ... 

ma non sembra essere una soluzione molto idiomatica al problema in questione.

+0

È un po 'strano che fallirà se viene passato un argomento che non è definito ma non viceversa, ma sembra che funzioni. È possibile eseguire uno script "test.sh" come passaggio in fase avanzata nel file Docker che controlla una serie di condizioni e le gestisce in modo appropriato. A seconda della complessità, potrebbe essere più facile gestirlo come un file separato. Se si tratta solo di uno o due ARG, il metodo in-line potrebbe in effetti essere il migliore. – ldg

risposta

6

Si potrebbe fare qualcosa di simile ...

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

Poi docker build -t my_variable_base .

Poi costruire le immagini in base a questa ...

FROM my_variable_base 
... 

Non è eccellente pulito, ma almeno esso astrae la sostanza "bleh" dall'immagine di base.

+0

Che non funziona quando si usa 'ONBUID', solo quando li rimuovo. –

6

Ho provato con "RUN test -n" cosa @konradstrack ha menzionato nel post originale (modifica) ... sembra che il compito di rendere obbligatoria la variabile come argomento build time per il comando build docker

FROM ubuntu 

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

Questa è una buona risposta. Il test è semplice e fornisce un contesto sufficiente in caso di errore. – Subfuzion

3

È inoltre possibile utilizzare shell parameter expansion per ottenere ciò.

Diciamo che il tuo argomento obbligatorio di compilazione si chiama MANDATORY_BUILD_ARGUMENT, e lo si vuole da impostare e non vuoto, il tuo Dockerfile potrebbe essere la seguente:

FROM debian:stretch-slim 
MAINTAINER Evel Knievel <[email protected]> 

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

Naturalmente, si potrebbe anche voler utilizzare il build-argument per qualcosa, a differenza di quanto ho fatto, ma comunque, consiglio di costruire questo Dockerfile e prenderlo per una prova :)

+1

Upvoting per bella sintassi – sleepycal

+0

Grazie, lo apprezzo :) –