Dockerfile'da bir değişken nasıl tanımlanır?


155

Benim içinde Dockerfile , ben istiyorum değişkenleri tanımlamak ben ki Dockerfile daha sonra kullanmak .

ENVTalimatın farkındayım , ancak bu değişkenlerin ortam değişkenleri olmasını istemiyorum.

Dockerfile kapsamındaki değişkenleri bildirmenin bir yolu var mı ?



@ lumos0815, bence bunu cevabınız olarak (eski bir yazı olmasına rağmen; gelecek nesiller için) OP'nin tam olarak istediği gibi yayınlamalısınız.
shriek

ARG, dockerfile içinde kullanılabilecek bir değişken tanımlamıyor. Aradığınızı elde etmek için bunu ENV komutuyla eşleştirmeniz gerekir; ARG foo; ENV FOO = $ foo; KOPYA dosyası $ foo (kötü biçimlendirme için özür dilerim, bir telefondan kod blokları ve çok satır yapmak mümkün değil)
ntwrkguru

Yanıtlar:


111

Kullanabilirsiniz ARG- bkz. Https://docs.docker.com/engine/reference/builder/#arg

ARGTalimat kullanıcıları ile oluşturucu derleme sırasında geçebilir bir değişken tanımlar docker buildkullanarak komuta --build-arg <varname>=<value>bayrağı. Bir kullanıcı Dockerfile dosyasında tanımlı olmayan bir yapı bağımsız değişkeni belirtirse, derleme bir hata verir.


@MargachChris COPY değişkenlerini kullanmak mümkün olmalıdır
lumos0815

COPY komutu için işe yaramıyor gibi görünüyor. docs.docker.com/engine/reference/builder/#arg
femibyte

54

Bildiğim ENVkadarıyla , sadece " Çevre değiştirme " de belirtildiği gibi buna izin verir

Ortam değişkenleri ( ENVifade ile bildirilen) bazı talimatlarda Dockerfile tarafından yorumlanacak değişkenler olarak da kullanılabilir.

Dockerfile tarafından her satır için oluşturulan her yeni kapsayıcılarda yeniden belirtilebilmesi için ortam değişkenleri olması gerekir docker build.

Başka bir deyişle, bu değişkenler doğrudan bir Dockerfile içinde değil, Dockerfile satırı için oluşturulan bir kapta yorumlanır, dolayısıyla ortam değişkeni kullanılır.


Bu gün hem ARG( docker 1.10+, vedocker build --build-arg var=value ) hem de kullanıyorum ENV.
Tek ARGbaşına kullanmak , değişkeninizin çalışma zamanında değil , derleme zamanında görülebileceği anlamına gelir .

Dockerfile dosyamda genellikle şunlar bulunur:

ARG var
ENV var=${var}

Sizin durumunuzda, ARGyeterlidir: Ben genellikle http_proxy değişkenini ayarlamak için kullanıyorum, bu docker yapı inşa zamanında internete erişmek için gerekir.


51

Soruna cevap vermek için:

Dockerfile'mda, daha sonra Dockerfile'da kullanabileceğim değişkenleri tanımlamak istiyorum.

Aşağıdakileri içeren bir değişken tanımlayabilirsiniz:

ARG myvalue=3

Eşit karakter çevresindeki boşluklara izin verilmez.

Ve daha sonra aşağıdakilerle birlikte kullanın:

RUN echo $myvalue > /test

13

Değişken aynı RUNkomut içinde yeniden kullanılırsa , bir kabuk değişkeni kolayca ayarlanabilir. Resmi Ruby Dockerfile ile buna nasıl yaklaştıklarını gerçekten çok seviyorum .


Mükemmel cevap. Mümkünse ARG'yi kullanmanız gerekirken, bazen dinamik bir değişken atamanız ve yeniden kullanmanız gerekir. Örnek:RUN foo=$(date) && echo $foo
wisbucky

3

ARG variable defaultValueÇalıştır komutunu kullanabilir ve kullanarak bu değeri güncelleyebilirsiniz --build-arg variable=value. Bu değişkenleri docker dosyasında kullanmak için bu $variablekomutları run komutundaki gibi kullanabilirsiniz.

Not: Bu değişkenler gibi Linux komutlarında kullanılabilir RUN echo $variableve görüntüde kalmazlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.