Apakah mungkin untuk menyetel variabel ENV buruh pelabuhan ke hasil perintah? Suka:
ENV MY_VAR whoami
saya ingin MY_VAR mendapatkan nilai "root" atau apa pun yang dikembalikan whoami
dockerfile
env
Sultanen
sumber
sumber
Jawaban:
Sebagai tambahan jawaban DarkSideF.
Anda harus menyadari bahwa setiap baris / perintah di Dockerfile dijalankan di penampung lain.
Anda bisa melakukan sesuatu seperti ini:
Ini dijalankan dalam satu wadah.
sumber
$bleah
adalah tidak tersedia di mana saja di luar perintah RUN ini, bahkan pada baris berikutnya di dockerfile yang sama, apalagi di gambar lain itu didasarkan dari. Fitur yang benar-benar hilang dari buruh pelabuhan di sini, sepertinya menulis ke dan membaca dari file adalah satu-satunya cara untuk benar-benar menyimpan variabel (dinamis) dalam gambar dan meneruskannya di antara gambar, yang tampaknya sangat hacky.Saya memiliki masalah yang sama dan menemukan cara untuk mengatur variabel lingkungan sebagai hasil dari fungsi dengan menggunakan perintah RUN di dockerfile.
Misalnya saya perlu mengatur SECRET_KEY_BASE untuk aplikasi Rails sekali saja tanpa mengubah seperti ketika saya menjalankan:
Sebagai gantinya saya menulis ke string Dockerfile seperti:
dan variabel env saya tersedia dari root, bahkan setelah login bash. atau mungkin
maka variabel itu tersedia dalam perintah CMD dan ENTRYPOINT
Docker men-cache-nya sebagai lapisan dan hanya berubah jika Anda mengubah beberapa string sebelumnya.
Anda juga dapat mencoba berbagai cara untuk menyetel variabel lingkungan.
sumber
*.sh
dalam file/etc/profile.d/
digunakan untuk mengisi lingkunganSaat ini, hasil perintah dapat digunakan dengan
RUN export
, tetapi tidak dapat ditetapkan keENV
variabel.Masalah yang diketahui: https://github.com/docker/docker/issues/29110
sumber
Jawaban ini adalah respon dari @DarkSideF ,
Metode yang dia usulkan adalah sebagai berikut, dalam
Dockerfile
:( menambahkan ekspor di
/etc/bash.bashrc
)Ini bagus tetapi variabel lingkungan hanya akan tersedia untuk proses tersebut
/bin/bash
, dan jika Anda mencoba menjalankan aplikasi buruh pelabuhan misalnya aplikasi Node.js,/etc/bash.bashrc
akan sepenuhnya diabaikan dan aplikasi Anda tidak akan memiliki petunjuk apaSECRET_KEY_BASE
pun saat mencoba untuk mengaksesprocess.env.SECRET_KEY_BASE
.Itulah alasan mengapa
ENV
kata kunci adalah apa yang semua orang coba gunakan dengan perintah dinamis karena setiap kali Anda menjalankan penampung atau menggunakanexec
perintah, Docker akan memeriksaENV
dan menyalurkan setiap nilai dalam proses yang saat ini dijalankan (mirip dengan-e
).Salah satu solusinya adalah dengan menggunakan pembungkus (kreditkan ke @duglin dalam masalah github ini ). Memiliki file pembungkus (misalnya
envwrapper
) di root proyek Anda yang berisi:dan kemudian di
Dockerfile
:sumber
Sebagai tambahan untuk jawaban @ DarkSideF, jika Anda ingin menggunakan kembali hasil dari perintah sebelumnya
Dockerfile
selama dalam proses build , Anda dapat menggunakan solusi berikut:Sebagai contoh :
Untuk sesuatu yang lebih bersih, Anda juga dapat menggunakan inti berikut yang menyediakan CLI kecil yang disebut
envstore.py
:Atau Anda dapat menggunakan pustaka python-dotenv yang memiliki CLI serupa.
sumber
Tidak yakin apakah ini yang Anda cari, tetapi untuk menyuntikkan ENV vars atau ARGS ke .Dockerfile Anda membangun pola ini bekerja.
di my_build.sh Anda:
untuk mendapatkan ARG di .Dockerfile Anda, cuplikannya mungkin terlihat seperti ini:
sebagai alternatif untuk mendapatkan ENV di .Dockerfile Anda, cuplikannya mungkin terlihat seperti ini:
Idenya adalah Anda menjalankan skrip shell dan memanggil .Dockerfile dengan argumen yang diteruskan sebagai opsi pada build.
sumber