Bagaimana cara mendefinisikan variabel di Dockerfile?

155

Di Dockerfile saya , saya ingin mendefinisikan variabel yang bisa saya gunakan nanti di Dockerfile .

Saya mengetahui ENVinstruksi tersebut, tetapi saya tidak ingin variabel-variabel ini menjadi variabel lingkungan.

Apakah ada cara untuk mendeklarasikan variabel di ruang lingkup Dockerfile ?

Maxime
sumber
10
Anda dapat menggunakan ARG - lihat docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, saya pikir Anda harus memposting itu sebagai jawaban Anda (meskipun itu adalah posting lama; untuk anak cucu) karena itulah yang diminta OP.
pekik
ARG tidak mendefinisikan var yang dapat digunakan di dalam dockerfile. Anda harus kawin dengan perintah ENV untuk mendapatkan apa yang Anda cari; ARG foo; ENV FOO = $ foo; File COPY $ foo (maaf untuk format yang buruk, saya kira itu tidak mungkin untuk melakukan blok kode dan multi-line dari telepon)
ntwrkguru

Jawaban:

111

Anda dapat menggunakan ARG- lihat https://docs.docker.com/engine/reference/builder/#arg

The ARGinstruksi mendefinisikan variabel yang pengguna dapat lulus pada build-waktu untuk pembangun dengan docker buildperintah menggunakan --build-arg <varname>=<value>bendera. Jika pengguna menentukan argumen build yang tidak didefinisikan di Dockerfile, build menghasilkan kesalahan.

lumos0815
sumber
@MargachChris harus dimungkinkan untuk menggunakan variabel untuk COPY
lumos0815
Tampaknya tidak berfungsi untuk perintah COPY. docs.docker.com/engine/reference/builder/#arg
femibyte
54

Setahu saya, hanya ENVmemungkinkan itu, seperti yang disebutkan dalam " Penggantian lingkungan "

Variabel lingkungan (dideklarasikan dengan ENVpernyataan) juga dapat digunakan dalam instruksi tertentu sebagai variabel yang akan ditafsirkan oleh Dockerfile.

Mereka harus menjadi variabel lingkungan untuk dideklarasikan ulang di setiap wadah baru yang dibuat untuk setiap baris Dockerfile docker build.

Dengan kata lain, variabel-variabel itu tidak ditafsirkan secara langsung di Dockerfile, tetapi dalam wadah yang dibuat untuk garis Dockerfile, karenanya penggunaan variabel lingkungan.


Hari ini, saya menggunakan keduanya ARG( buruh pelabuhan 1.10+, dandocker build --build-arg var=value ) dan ENV.
Menggunakan ARGsendiri berarti variabel Anda terlihat pada waktu pembuatan, bukan saat runtime.

Dockerfile saya biasanya memiliki:

ARG var
ENV var=${var}

Dalam kasus Anda, ARGsudah cukup: Saya menggunakannya secara khusus untuk mengatur variabel http_proxy, buruh pelabuhan itu perlu mengakses internet saat membangun.

VONC
sumber
51

Untuk menjawab pertanyaan Anda:

Di Dockerfile saya, saya ingin mendefinisikan variabel yang bisa saya gunakan nanti di Dockerfile.

Anda dapat mendefinisikan variabel dengan:

ARG myvalue=3

Spasi di sekitar karakter yang sama tidak diizinkan.

Dan gunakan nanti dengan:

RUN echo $myvalue > /test
Ortomala Lokni
sumber
13

Jika variabel digunakan kembali dalam RUNinstruksi yang sama , seseorang dapat dengan mudah mengatur variabel shell. Saya sangat suka bagaimana mereka mendekati ini dengan Ruby Dockerfile resmi .

Evgeny Chernyavskiy
sumber
Jawaban yang bagus Meskipun Anda harus menggunakan ARG jika memungkinkan, terkadang Anda perlu menetapkan dan menggunakan kembali variabel dinamis. Contoh:RUN foo=$(date) && echo $foo
wisbucky
3

Anda dapat menggunakan ARG variable defaultValuedan selama menjalankan perintah Anda bahkan dapat memperbarui nilai ini menggunakan --build-arg variable=value. Untuk menggunakan variabel-variabel ini dalam file buruh pelabuhan Anda dapat menyebutnya sebagai$variable dalam menjalankan perintah.

Catatan: Variabel-variabel ini akan tersedia untuk perintah Linux seperti RUN echo $variabledan mereka tidak akan bertahan dalam gambar.

pengguna2719152
sumber