मैं ENTRYPOINT सरणी में डॉकर पर्यावरण चर का उपयोग कैसे करूं?


109

यदि मैं एक पर्यावरण चर सेट करता हूं ENV ADDRESSEE=world, तो मैं कहता हूं , और मैं इसे एक निश्चित स्ट्रिंग में दर्ज प्रविष्टि बिंदु स्क्रिप्ट में उपयोग करना चाहता हूं:

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

worldपर्यावरण के मूल्य के साथ , मैं इसे कैसे करूँ? मैं का उपयोग करने की कोशिश की, "Hello, $ADDRESSEE"लेकिन यह काम नहीं लगता है, क्योंकि यह $ADDRESSEEसचमुच लेता है ।

जवाबों:


216

आप ENTRYPOINT के निष्पादन फ़ॉर्म का उपयोग कर रहे हैं । शेल फॉर्म के विपरीत , निष्पादन फॉर्म कमांड शेल को लागू नहीं करता है। इसका मतलब यह है कि सामान्य शेल प्रसंस्करण नहीं होता है। उदाहरण के लिए, ENTRYPOINT [ "echo", "$HOME" ]$ HOME पर परिवर्तनीय प्रतिस्थापन नहीं करेंगे। यदि आप शेल प्रोसेसिंग चाहते हैं तो या तो शेल फॉर्म का उपयोग करें या सीधे शेल निष्पादित करें, उदाहरण के लिए ENTRYPOINT [ "sh", "-c", "echo $HOME" ]:।
निष्पादन प्रपत्र का उपयोग करते समय और सीधे शेल को निष्पादित करते समय, शेल फॉर्म के मामले में, यह शेल है जो पर्यावरण चर विस्तार कर रहा है, डॉकटर नहीं। ( डॉकरफाइल संदर्भ से )

आपके मामले में, मैं शेल फॉर्म का उपयोग करूंगा

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portजबकि ENV port=123। पोर्ट ENV हल नहीं है। कोई विचार क्यों?
xetra11

1
जब यह काम करता है, तो यह कुछ नई समस्याएं पैदा करता है, जैसे उस प्रविष्टि के लिए पारित तर्क शामिल नहीं हैं। उदाहरण के लिए, आप कमांड में एक --attitude "shouting"तर्क नहीं जोड़ सकते हैं docker runजो कि पास हो जाना चाहिए./greeting
डैनियल एफ

5
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"यदि आप अतिरिक्त चर को मंगलाचरण के ./greetingमाध्यम से docker run(या CMDडॉकफाइल को पास करना चाहते हैं) का उपयोग करना चाहते हैं
डैनियल एफ

3
ध्यान दें कि शेल फॉर्म सिग्नल को प्रक्रिया के माध्यम से पारित नहीं होने का कारण बन सकता है ( greetingआपके उदाहरण में)। hynek.me/articles/docker-signals
jbg

क्या मैं निष्पादन रूप में एक पर्यावरण चर का मान प्राप्त कर सकता हूं, जैसे `[myexecutable.sh," $ variable "], मैं इसे [" sh "," -c "," echo $ var "] द्वारा कर सकता हूं, लेकिन नहीं इस तरह
लाजर

13

मैंने सुझाए गए उत्तर के साथ हल करने की कोशिश की और फिर भी कुछ मुद्दों में भाग गया ...

यह मेरी समस्या का हल था:

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

विशेष रूप से आपकी समस्या को लक्षित करते हुए:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

ऐसा लगता है कि आपका उत्तर ओपी के प्रश्न का पूर्ण समाधान प्रदान नहीं करता है
user9405863

मुझे लगता है मुझे समझ नहीं आ रहा है कि यह ओपी के सवाल का हल कैसे उपलब्ध नहीं कराता ... मैंने एक उदाहरण के साथ सटीक प्रश्न को ध्यान में रखकर हल किया।
बेन कॉफ़मैन

आपने अभी भी उल्लेख किया आप कुछ मुद्दों में भाग गए !!
user9405863

सही है, यही वजह है कि मैंने एक नया समाधान पेश किया। ... "स्वीकृत" उत्तर मेरे लिए काम नहीं करता था, इसलिए मैं एक शेल स्क्रिप्ट की गूंज करता था और वह काम करता था।
बेन कॉफ़मैन

2
मुझे आपका दृष्टिकोण सुनने में दिलचस्पी होगी, फिर @ReverendTim;)
बेन कॉफ़मैन

6

बहुत दर्द के बाद, और ऊपर @vitr एट अल से बहुत सहायता के बाद, मैंने कोशिश करने का फैसला किया

  • मानक बैश प्रतिस्थापन
  • ENTRYPOINT का शेल रूप (ऊपर से शानदार टिप)

और वह काम किया।

ENV LISTEN_PORT=""

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

जैसे

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

तथा

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

दोनों ने मेरे कंटेनर में सही ढंग से पोर्ट सेट किया

refs

देख https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.