Come definire una variabile in un file Docker?


156

Nel mio Dockerfile , vorrei definire le variabili che posso usare in seguito nel Dockerfile .

Sono a conoscenza delle ENVistruzioni, ma non voglio che queste variabili siano variabili d'ambiente.

C'è un modo per dichiarare le variabili nell'ambito di Dockerfile ?



@ lumos0815, penso che dovresti pubblicarlo come risposta (anche se si tratta di un vecchio post; per i posteri) poiché è esattamente ciò che OP richiede.
grido

ARG non definisce un var che può essere utilizzato all'interno del file docker. Dovresti accoppiarlo con il comando ENV per ottenere quello che stai cercando; ARG foo; ENV FOO = $ foo; COPY file $ foo (scusate per la formattazione errata, immagino che non sia possibile fare blocchi di codice e linee multiple da un telefono)
ntwrkguru

Risposte:


111

È possibile utilizzare ARG: consultare https://docs.docker.com/engine/reference/builder/#arg

L' ARGistruzione definisce una variabile che gli utenti possono passare in fase di compilazione al builder con il docker buildcomando utilizzando il --build-arg <varname>=<value>flag. Se un utente specifica un argomento di build che non è stato definito nel Dockerfile, la build genera un errore.


@MargachChris dovrebbe essere possibile usare le variabili per COPY
lumos0815

Non sembra funzionare per il comando COPIA. docs.docker.com/engine/reference/builder/#arg
femibyte

54

Per quanto ne so, lo ENVconsente solo , come indicato in " Sostituzione dell'ambiente "

Le variabili d'ambiente (dichiarate con l' ENVistruzione) possono anche essere utilizzate in alcune istruzioni come variabili che devono essere interpretate dal Dockerfile.

Devono essere variabili di ambiente per poter essere rideclarte in ogni nuovo contenitore creato per ogni riga del Dockerfile da docker build.

In altre parole, tali variabili non vengono interpretate direttamente in un file Dockerfile, ma in un contenitore creato per una linea Dockerfile, da cui l'utilizzo della variabile d'ambiente.


Oggi uso entrambi ARG( docker 1.10+ edocker build --build-arg var=value ) e ENV.
L'uso da ARGsolo significa che la tua variabile è visibile al momento della creazione, non in fase di esecuzione.

Il mio Dockerfile di solito ha:

ARG var
ENV var=${var}

Nel tuo caso, ARGè abbastanza: lo uso in genere per impostare la variabile http_proxy, che la build docker ha bisogno per accedere a Internet in fase di compilazione.


51

Per rispondere alla tua domanda:

Nel mio Dockerfile, vorrei definire le variabili che posso usare in seguito nel Dockerfile.

Puoi definire una variabile con:

ARG myvalue=3

Gli spazi attorno allo stesso personaggio non sono ammessi.

E usalo in seguito con:

RUN echo $myvalue > /test

13

Se la variabile viene riutilizzata all'interno della stessa RUNistruzione, si potrebbe semplicemente impostare una variabile di shell. Mi piace molto come si sono avvicinati a questo con il Ruby Dockerfile ufficiale .


Bella risposta. Sebbene sia possibile utilizzare ARG, se possibile, a volte è necessario assegnare e riutilizzare una variabile dinamica. Esempio:RUN foo=$(date) && echo $foo
wisbucky

3

È possibile utilizzare ARG variable defaultValuee durante il comando di esecuzione è anche possibile aggiornare questo valore utilizzando --build-arg variable=value. Per utilizzare queste variabili nel file docker è possibile fare riferimento a come $variablenel comando Esegui.

Nota: queste variabili sarebbero disponibili per comandi Linux simili RUN echo $variablee non persisterebbero nell'immagine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.