আমি 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.