Bagaimana cara menggunakan variabel lingkungan Docker dalam array ENTRYPOINT?

109

Jika saya menetapkan variabel lingkungan, katakanlah ENV ADDRESSEE=world, dan saya ingin menggunakannya dalam skrip titik masuk yang digabungkan menjadi string tetap seperti:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

dengan worldmenjadi nilai varible lingkungan, bagaimana cara melakukannya? Saya mencoba menggunakan "Hello, $ADDRESSEE"tetapi tampaknya tidak berhasil, karena $ADDRESSEEsecara harfiah.

Pukulan Psiko
sumber

Jawaban:

216

Anda menggunakan bentuk exec ENTRYPOINT. Berbeda dengan bentuk shell , bentuk exec tidak memanggil perintah shell. Ini berarti pemrosesan shell normal tidak terjadi. Misalnya, ENTRYPOINT [ "echo", "$HOME" ]tidak akan melakukan substitusi variabel pada $ HOME. Jika Anda ingin pengolahan shell maka baik menggunakan bentuk shell atau mengeksekusi shell langsung, misalnya: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Saat menggunakan formulir exec dan menjalankan shell secara langsung, seperti dalam kasus formulir shell, shelllah yang melakukan ekspansi variabel lingkungan, bukan buruh pelabuhan. (Dari referensi Dockerfile )

Dalam kasus Anda, saya akan menggunakan formulir shell

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
vitr
sumber
2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portsementara ENV port=123. Port ENV tidak diselesaikan. Ada ide mengapa?
xetra11
1
Saat berhasil, tampaknya membuat beberapa masalah baru, seperti tidak menyertakan argumen yang diteruskan ke titik masuk tersebut. Misalnya Anda tidak dapat menambahkan --attitude "shouting"argumen ke docker runperintah yang harus diteruskan ke./greeting
Daniel F
5
Gunakan ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"jika Anda juga ingin meneruskan variabel tambahan ke ./greetingmelalui docker runpemanggilan (atau meneruskan CMDDockerfile)
Daniel F
3
Perhatikan bahwa bentuk shell dapat menyebabkan sinyal tidak diteruskan ke proses ( greetingdalam contoh Anda). hynek.me/articles/docker-signals
jbg
dapatkah saya mendapatkan nilai variabel lingkungan dalam bentuk exec, seperti `[myexecutable.sh," $ variable "], saya dapat melakukannya dengan [" sh "," -c "," echo $ var "], tetapi tidak dengan cara ini
lazarus
13

Saya mencoba menyelesaikan dengan jawaban yang disarankan dan masih mengalami beberapa masalah ...

Ini adalah solusi untuk masalah saya:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

Secara khusus menargetkan masalah Anda:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Ben Kauffman
sumber
tampaknya jawaban Anda tidak memberikan solusi yang lengkap. Pertanyaan OP
user9405863
Saya kira saya tidak mengerti bagaimana itu tidak memberikan solusi untuk pertanyaan OP ... Saya memperbarui dengan contoh untuk menyelesaikan dengan pertanyaan yang tepat dalam pikiran.
Ben Kauffman
Anda menyebutkan masih Anda mengalami beberapa masalah !!
pengguna9405863
benar, itulah sebabnya saya memperkenalkan solusi baru. ... jawaban "diterima" tidak berhasil untuk saya, jadi saya menggemakan skrip shell dan itu berhasil.
Ben Kauffman
2
Saya akan tertarik untuk mendengar pendekatan Anda lalu @ReverendTim;)
Ben Kauffman
6

Setelah banyak rasa sakit, dan bantuan besar dari @vitr dkk di atas, saya memutuskan untuk mencoba

  • substitusi pesta standar
  • shell bentuk dari EntryPoint (tip besar dari atas)

dan itu berhasil.

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

misalnya

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

dan

docker run --rm -p 8080:80 -d my-image

keduanya mengatur port dengan benar di penampung saya

Referensi

lihat https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

mlo55
sumber