buruh pelabuhan ENV vs ekspor RUN

91

Katakanlah saya ingin menggabungkan perintah ini

RUN command_1
ENV FOO bar
RUN command_2

ke

RUN command_1 && export FOO=bar && command_2

dan bertanya-tanya apakah mengatur variabel dengan RUN exportvs ENVsetara.

Dengan kata lain, apakah ada perbedaan antara perintah-perintah ini di Dockerfile?

ENV FOO bar

vs.

RUN export FOO=bar
Pengguna314159
sumber

Jawaban:

148

Seperti yang diilustrasikan oleh masalah 684 , exporttidak akan bertahan di seluruh gambar. (Jangan lupa bahwa setiap direktif Dockerfile akan menghasilkan penampung perantara, yang dikomit menjadi gambar perantara: gambar itu tidak akan mempertahankan nilai yang diekspor)
ENVakan:

Variabel lingkungan yang disetel menggunakan ENVakan tetap ada saat penampung dijalankan dari gambar yang dihasilkan.
Anda dapat melihat nilai menggunakan docker inspect, dan mengubahnya menggunakan docker run --env <key>=<value>.

Masalah tersebut diilustrasikan dengan:

RUN export PATH=$PATH:/foo/bar # from directly in builder

Ketika saya melakukannya docker run [img] bash -c 'echo $PATH'tidak pernah termasuk /foo/bar.

Cobalah

Buat file galangan baru yang berisi:

FROM centos:6
ENV FOO=foofoo
RUN export BAR=barbar
RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

Lalu bangunlah. Output dari langkah terakhir adalah:

Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"
 ---> Running in eb66196b238d
foofoo  bazbaz

Anda dapat melihat:

  • FOObertahan melalui wadah perantara, berkat ENVkata kunci;
  • BARtidak bertahan di langkah berikutnya, karena exportperintah;
  • BAZ ditampilkan dengan benar karena variabel digunakan di penampung yang sama.
VonC
sumber
(Saya rasa ya, tapi :) Apakah itu berarti bahwa dockermisalnya rundengan --env-fileatau --envakan mengekspor variabel (dengan argumen opsi ini)? Maaf karena menemukan jawaban lama seperti itu, tetapi penelusuran web baru saja menyampaikannya kepada saya. Jawaban bagus btw.
hakre
@hakre ya, mereka ditambahkan ke lingkungan: lihat stackoverflow.com/a/49872152/6309 dan di bawahnya.
VonC
Terima kasih atas balasan cepatnya, tetapi jawaban itu tidak menunjukkan variabel yang ditandai untuk ekspor. Setidaknya tidak untuk saya. Bagaimanapun, saya harus mengerjakan pekerjaan rumah saya sendiri di sini, misalnya superuser.com/q/450868/63279 atau pubs.opengroup.org/onlinepubs/9699919799/utilities/… .
hakre