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.

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\!"

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"]

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.