Saya memiliki dockerfile
FROM centos:7
ENV foo=42
lalu saya membangunnya
docker build -t my_docker .
dan jalankan.
docker run -it -d my_docker
Apakah mungkin untuk meneruskan argumen dari baris perintah dan menggunakannya dengan if else di Dockerfile? Maksudku seperti itu
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
dan membangun dengan argumen ini.
docker build -t my_docker . --my_arg=42
docker
dockerfile
nick_gabpe
sumber
sumber
RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi
. Atau jika arg mungkin hilang:RUN if [ "x$arg" == "x42" ]; then ...
Jawaban:
Ini mungkin tidak terlihat bersih tetapi Anda dapat memiliki Dockerfile (bersyarat) sebagai berikut:
dan kemudian buat gambar sebagai:
docker build -t my_docker . --build-arg arg=45
atau
docker build -t my_docker .
sumber
[ "$arg" = "x" ]
bukan[ "x$arg" = "x" ]
?if [ $arg != "" ] ;
tetapi saya yakin ada beberapa gotcha yang tidak saya kenalif [[ -n "$arg" ]]
benar jika parameter tidak kosong,if [[ -z "$arg" ]]
benar jika parameter kosong[ "x$arg" = "x" ]
terlihat seperti membandingkan dua string yang dikutip, tetapi tanda kutipnya dihapus ; Ini membuat sintaks tetap benar. Setelah kutipan-pengupasan: Baik:if x = x ..
. Bad:if =
. NAMUN, ada cara yang lebih baik untuk memeriksa keberadaan parameter: Periksa keberadaan argumen input .Dari beberapa alasan sebagian besar jawaban di sini tidak membantu saya (mungkin ini terkait dengan gambar FROM saya di Dockerfile)
Jadi saya lebih suka membuat
bash script
di ruang kerja saya dikombinasikan dengan--build-arg
untuk menangani pernyataan if sementara Docker membangun dengan memeriksa apakah argumennya kosong atau tidakSkrip Bash:
Dockerfile:
Docker Build:
Catatan: Ini akan menuju ke else (false) di skrip bash
Catatan: Ini akan pergi ke if (true)
Edit 1:
Setelah beberapa kali saya telah menemukan berikut artikel dan ini salah satu yang membantu saya untuk memahami 2 hal:
1) ARG before FROM berada di luar build
2) Shell default adalah / bin / sh yang berarti if else berfungsi sedikit berbeda dalam build buruh pelabuhan. misalnya Anda hanya perlu satu "=" daripada "==" untuk membandingkan string.
Jadi, Anda dapat melakukan ini di dalam
Dockerfile
dan di
docker build
:sumber
Menurut doc untuk
docker build
perintah tersebut , ada parameter yang dipanggil--build-arg
.Contoh penggunaan:
IMO itu yang Anda butuhkan :)
sumber
Ada alternatif menarik untuk solusi yang diusulkan, yang berfungsi dengan satu Dockerfile , hanya memerlukan satu panggilan ke build docker per build bersyarat dan menghindari bash .
Larutan:
Berikut ini
Dockerfile
memecahkan masalah itu. Salin-tempel dan coba sendiri.Penjelasan Dockerfile:
Kami pertama kali mendapatkan
base
gambar (centos:7
dalam kasus Anda) dan memasukkannya ke dalam panggungnya sendiri. Thebase
panggung harus berisi hal-hal yang ingin Anda lakukan sebelum kondisi tersebut. Setelah itu, kami memiliki dua tahap lagi, mewakili cabang dari kondisi kami:branch-version-1
danbranch-version-2
. Kami membangun keduanya. Thefinal
panggung dari memilih salah satu dari tahap ini, berdasarkanmy_arg
. Dockerfile Bersyarat. Ini dia.Output saat berjalan:
(Saya menyingkat ini sedikit ...)
my_arg==2
my_var==1
Terima kasih kepada Tõnis untuk ide luar biasa ini!
sumber
Cukup gunakan biner "test" secara langsung untuk melakukan ini. Anda juga harus menggunakan perintah noop ":" jika Anda tidak ingin menentukan kondisi "lain", jadi buruh pelabuhan tidak berhenti dengan kesalahan nilai pengembalian bukan nol.
sumber
RUN [ -z "$YOURVAR" ] && ... || :
, saya percayaRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
&&
di depan||
:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"
Persis seperti yang dikatakan orang lain, skrip shell akan membantu.
Hanya kasus tambahan, IMHO itu layak disebut (untuk orang lain yang tersandung di sini, mencari kasus yang lebih mudah), yaitu pengganti Lingkungan .
sumber
The jawaban yang diterima dapat memecahkan pertanyaan, tetapi jika Anda ingin multiline
if
kondisi di dockerfile, Anda dapat melakukan penempatan yang\
pada akhir setiap baris (mirip dengan bagaimana Anda akan melakukannya dalam shell script) dan berakhir setiap perintah dengan;
. Anda bahkan dapat mendefinisikan sesuatu sepertiset -eux
perintah pertama.Contoh:
Dalam kasus Anda:
Kemudian bangun dengan:
sumber
Menggunakan script Bash dan Alpine / Centos
Dockerfile
script.sh
Mengoper arg:
docker build -t test --build-arg MYARG="this is a test" .
Tanpa arg:
docker build -t test .
sumber