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.