আমি 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" ]
Exec ফর্ম ব্যবহার করে এবং সরাসরি একটি শেল নির্বাহ শেল ফর্ম জন্য কেস হিসাবে, তখন তা শেল যে এনভায়রনমেন্ট ভেরিয়েবল সম্প্রসারণ করছে, (থেকে Docker না। Dockerfile রেফারেন্স )

আপনার ক্ষেত্রে, আমি শেল ফর্মটি ব্যবহার করব

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আবাহন (অথবা পাস CMDDockerfile এর)
ড্যানিয়েল এফ

3
মনে রাখবেন যে শেল ফর্মটি প্রক্রিয়াটি ( greetingআপনার উদাহরণস্বরূপ) এর মাধ্যমে সংকেতগুলি পাস না করার কারণ হতে পারে । hynek.me/articles/docker-signals
jbg

আমি কি এক্সিকিউটিভ ভেরিয়েবলের এক্সিকিউটিভ আকারে, যেমন `[myexecutable.sh," $ ভেরিয়েবল "] পেতে পারি, আমি এটি [" sh "," -c "," প্রতিধ্বনি $ 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"]

দেখে মনে হচ্ছে আপনার উত্তরটি
ওপির

আমি মনে করি কীভাবে এটি ওপি-র প্রশ্নের সমাধান সরবরাহ করে না আমি বুঝতে পারি না ... সঠিক প্রশ্নটি মাথায় রেখে সমাধানের জন্য আমি একটি উদাহরণ দিয়ে আপডেট করেছি।
বেন কাউফম্যান

আপনি এখনও উল্লেখ করেছেন আপনি কিছু সমস্যা নিয়ে ছুটে গেছেন !!
ব্যবহারকারী 9405863

সঠিক, যে কারণে আমি একটি নতুন সমাধান প্রবর্তন। ... "গৃহীত" উত্তরটি আমার পক্ষে কার্যকর হয়নি, তাই আমি শেল স্ক্রিপ্টে প্রতিধ্বনিত হয়েছি এবং এটি কাজ করেছিল।
বেন কাউফম্যান

2
আমি আপনার যোগাযোগটি শুনতে আগ্রহী তখন @ রিভারেন্ডটাইম;)
বেন

6

উপরে অনেক ব্যথা, এবং উপরে @ ভিটর এট আল এর দুর্দান্ত সহায়তার পরে , আমি চেষ্টা করার সিদ্ধান্ত নিয়েছি

  • স্ট্যান্ডার্ড বাশ প্রতিস্থাপন
  • শেল ফর্ম এর 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.