Jak zdefiniować zmienną w pliku Dockerfile?

155

W moim pliku Dockerfile chciałbym zdefiniować zmienne, których będę mógł później użyć w pliku Dockerfile .

Znam ENVinstrukcję, ale nie chcę, aby te zmienne były zmiennymi środowiskowymi.

Czy istnieje sposób na zadeklarowanie zmiennych w zakresie Dockerfile ?

Maxime
źródło
10
możesz używać ARG - patrz docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, myślę, że powinieneś opublikować to jako swoją odpowiedź (mimo że jest to stary post; dla potomnych), ponieważ jest to dokładnie to, o co prosi OP.
krzyk
ARG nie definiuje zmiennej, której można użyć w pliku dockerfile. Musiałbyś to połączyć z poleceniem ENV, aby uzyskać to, czego szukasz; ARG foo; ENV FOO = $ foo; KOPIUJ plik $ foo (przepraszam za złe formatowanie, myślę, że nie można zrobić bloków kodu i wielu linii z telefonu)
ntwrkguru

Odpowiedzi:

111

Możesz użyć ARG- zobacz https://docs.docker.com/engine/reference/builder/#arg

ARGInstrukcja definiuje zmienną, że użytkownicy mogą przechodzić w czasie kompilacji do konstruktora z docker buildkomendy przy użyciu --build-arg <varname>=<value>flagi. Jeśli użytkownik określi argument kompilacji, który nie został zdefiniowany w pliku Dockerfile, kompilacja zwróci błąd.

lumos0815
źródło
@MargachChris powinno móc używać zmiennych dla COPY
lumos0815
Wydaje się, że nie działa w przypadku polecenia KOPIUJ. docs.docker.com/engine/reference/builder/#arg
femibyte
54

O ile mi wiadomo, ENVzezwala tylko na to, jak wspomniano w sekcjiWymiana środowiska

Zmienne środowiskowe (zadeklarowane za pomocą ENVinstrukcji) mogą być również używane w niektórych instrukcjach jako zmienne do interpretacji przez plik Dockerfile.

Muszą to być zmienne środowiskowe, aby mogły zostać ponownie zadeklarowane w każdym nowym kontenerze tworzonym dla każdej linii pliku Dockerfile przez docker build.

Innymi słowy, te zmienne nie są interpretowane bezpośrednio w pliku Dockerfile, ale w kontenerze utworzonym dla wiersza Dockerfile, stąd użycie zmiennej środowiskowej.


Dziś używam obu ARG( docker 1.10+ idocker build --build-arg var=value ) oraz ENV.
Używanie ARGsamego oznacza, że ​​zmienna jest widoczna w czasie kompilacji, a nie w czasie wykonywania.

Mój plik Dockerfile zazwyczaj zawiera:

ARG var
ENV var=${var}

W twoim przypadku ARGwystarczy: używam go zwykle do ustawienia zmiennej http_proxy, której kompilacja dockerowa potrzebuje, aby uzyskać dostęp do Internetu w czasie kompilacji.

VonC
źródło
51

Odpowiedzieć na Twoje pytanie:

W moim pliku Dockerfile chciałbym zdefiniować zmienne, których będę mógł użyć później w pliku Dockerfile.

Możesz zdefiniować zmienną za pomocą:

ARG myvalue=3

Spacje wokół znaku równości są niedozwolone.

I użyj go później z:

RUN echo $myvalue > /test
Ortomala Lokni
źródło
13

Jeśli zmienna zostanie ponownie użyta w tej samej RUNinstrukcji, można po prostu ustawić zmienną powłoki. Bardzo podoba mi się sposób, w jaki podeszli do tego z oficjalnym plikiem Ruby Dockerfile .

Evgeny Chernyavskiy
źródło
Świetna odpowiedź. Chociaż powinieneś używać ARG, jeśli to możliwe, czasami musisz przypisać i ponownie użyć zmiennej dynamicznej. Przykład:RUN foo=$(date) && echo $foo
wisbucky
3

Możesz użyć, ARG variable defaultValuea podczas wykonywania polecenia możesz nawet zaktualizować tę wartość za pomocą --build-arg variable=value. Aby użyć tych zmiennych w pliku docker, możesz odnieść się do nich jak $variablew poleceniu run.

Uwaga: te zmienne byłyby dostępne dla poleceń systemu Linux, takich jak RUN echo $variablei nie byłyby trwałe w obrazie.

user2719152
źródło