ডকফাইফিলে ডকার পাত্রে কীভাবে বাশ এলিয়াস সেট করবেন?


87

আমি ডকারে নতুন আমি দেখেছি যে আমরা ডকফাইফিলে ENV নির্দেশ ব্যবহার করে পরিবেশের পরিবর্তনগুলি সেট করতে পারি। তবে কীভাবে একজন ডকফাইফিলে লম্বা কমান্ডের জন্য বাশকে উপকরণ দেয়?


alias লেখা মূলত একটি জন্য অসমর্থিত বিবেচনা করা হয়েছে খুব দীর্ঘ সময়। একটি ফাংশন ব্যবহার করুন। আর এখন পর্যন্ত কোনো প্রয়োজন নেই কি কখনো উপনাম ব্যবহার করুন। ৮০ এর দশকের শেষের দিক থেকে এই পদ্ধতিগুলি এত দিন ধরে কীভাবে চলছে?
উইলিয়াম পার্সেল

19
কারণ তারা অবশ্যই সুবিধাজনক এবং সাধারণ।
আর্থার

13
পছন্দ করেছেন
এরিক ডেলা ক্রুজ

4
উপকরণগুলি সহজ, সুবিধাজনক, ভঙ্গুর এবং ত্রুটির প্রবণ। ফাংশনগুলি ব্যবহার করা ঠিক তত সহজ, তবে আরও নমনীয়তা এবং দৃust়তা সরবরাহ করে। সেগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে প্রচুর সংস্থান রয়েছে।
উইলিয়াম পার্সেল

উত্তর:


144

মূলত আপনি যেমন সর্বদা করেন, ব্যবহারকারীর সাথে এটি যুক্ত করে .bashrc:

FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc

যথারীতি এটি কেবল ইন্টারেক্টিভ শেলগুলির জন্য কাজ করবে:

docker build -t test .
docker run -it --rm --entrypoint /bin/bash test hi
/bin/bash: hi: No such file or directory
docker run -it --rm test bash
$ hi
hello

অ-ইন্টারেক্টিভ শেলের জন্য আপনার একটি ছোট স্ক্রিপ্ট তৈরি করা উচিত এবং এটি আপনার পথে রাখা উচিত, যেমন:

RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
    chmod +x /usr/bin/hi

যদি আপনার উপনামটি প্যারামিটার ব্যবহার করে (যেমন hi Jim- -> hello Jim), কেবল যুক্ত করুন "$@":

RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
    chmod +x /usr/bin/hi

এর জন্য ধন্যবাদ আপনি অ ইন্টারেক্টিভ শেলটির উদাহরণ সরবরাহ করতে পারেন? আমি এটি সমাধানের জন্য ENTRYPOINT এবং সিএমডি
খুঁজছিলাম

4
বাশ ওরফে কেবল ইন্টারেক্টিভ শেলগুলিতে কাজ করে। কেবল একটি ছোট শেল স্ক্রিপ্ট তৈরি করুন এবং আপনার পথে রাখুন, একটি উপাধিকার মতোই প্রভাব। একটি সহজ উদাহরণ সহ উত্তর আপডেট।
এরিক ড্যানেনবার্গ

4
নোট: থেকে stackoverflow.com/a/8467449 আপনি বরং ব্যবহার করা উচিত printf, পরিবর্তে প্রতিধ্বনি আরও বেশি সঙ্গতিপূর্ণ আচরণ নিশ্চিত করতে হবে। তাই printf! # / বিন / ব্যাশ \ necho হ্যালো '> / usr / bin / হাই chmod + X / usr / bin / হাই
barraq

4
শেল স্ক্রিপ্ট ধারণা পছন্দ। উপনাম যুক্ত করার চেষ্টা করছিল তবে এটি আরও অনেক ভাল। ধন্যবাদ
বরফ

4
আপনার একাধিক যুক্তি পালানোর জন্য "$ @" এর পরিবর্তে "$ @" ব্যবহার করা উচিত। দেখুন unix.stackexchange.com/questions/248464/…
gnou

14

বিদ্যমান কমান্ডের একটি উপনাম তৈরি করতে, এটি ব্যবহার করতে পারে ln -s:

ln -s $(which <existing_command>) /usr/bin/<my_command>


7
আমি এটিকে একটি উপনাম বলব না .. এটি নরম লিঙ্ক / সিমিলিংক। এলিয়াসগুলির সুবিধা হ'ল আপনি কমান্ডটিতে প্যারামিটারগুলি পাস করতে পারেন alias ll='ls -lh'যা সিমলিঙ্কগুলি দিয়ে সম্ভব নয়।
কিওয়ার্টজ

3

আপনি যদি কেবল ডকফাইফিলে এলিয়াস ব্যবহার করতে চান তবে কনটেইনারটির মধ্যে না থেকে তবে সবচেয়ে সংক্ষিপ্ততম উপায়টি হ'ল ENVঘোষণা:

ENV update='apt-get update -qq'
ENV install='apt-get install -qq'

RUN $update && $install apt-utils \
    curl \
    gnupg \
    python3.6

এবং ধারক ব্যবহারের জন্য ইতিমধ্যে বর্ণিত মত:

 RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
 RUN chmod +x /usr/bin/install

বেশিরভাগ সময় আমি এলিয়াসগুলি কেবল বিল্ডিং স্টেজেই ব্যবহার করি এবং পাত্রে insideুকি না, সুতরাং প্রথম উদাহরণটি প্রতিদিন ব্যবহারের জন্য দ্রুত, পরিষ্কার এবং সহজ is


2

আমি কেবল এটি আমার অ্যাপ্লিকেশনটিতে যুক্ত করেছি ock

# setup aliases
ADD ./bashrc_alias.sh /usr/sbin/bashrc_alias.sh
ADD ./initbash_profile.sh /usr/sbin/initbash_profile
RUN chmod +x /usr/sbin/initbash_profile
RUN /bin/bash -C "/usr/sbin/initbash_profile"

এবং এর ভিতরে initbash_profile.shযা কেবলমাত্র আমার কাস্টম উপাধি সংযোজন করে এবং .bashrc ফাইল উত্সের প্রয়োজন নেই।

# add the bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc

একটি ট্রিট কাজ!

অন্য বিকল্পটি হ'ল কেবলমাত্র ধারকটির বাইরে থেকে "ডকার এক্সিকিউটিউট-কমান্ড" ব্যবহার করা এবং কেবল নিজের নিজস্ব .Bashrc বা .bash_profile (আপনি যা পছন্দ করেন) ব্যবহার করুন

যেমন docker exec -it docker_app_1 bash


1

আপনি এন্ট্রিপয়েন্টটি ব্যবহার করতে পারেন, তবে এটি আপনার ডকফাইফিলে, উলের জন্য কাজ করবে না:

ADD dev/entrypoint.sh /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]

তোমার entrypoint.sh

#!/bin/bash
set -e

function dev_run()
{

}

export -f dev_run

exec "$@"

(দ্রুত কপি / পেস্ট করুন, দুঃখিত)


মনোযোগ দিন যে কিছু ডকার চিত্র ইতিমধ্যে ডিফল্ট এন্ট্রিপয়েন্টটি ওভাররাইড করতে পারে (যেমন ফিউশন বেস চিত্র)।
টমাস ডিকোক্স

1

আমি মনে করি সবচেয়ে সহজ উপায় হ'ল আপনার কনটেইনারটিতে কোনও ফাইল আপনার এলিয়াসযুক্ত মাউন্ট করা এবং তারপরে বাশটি কোথায় খুঁজে পাওয়া উচিত তা নির্দিষ্ট করে:

docker run \
    -it \
    --rm \
    -v ~/.bash_aliases:/tmp/.bash_aliases \
    [image] \
    /bin/bash --init-file /tmp/.bash_aliases

নমুনা ব্যবহার:

user@cobalt:~$ echo 'alias what="echo it works"' > my_aliases
user@cobalt:~$ docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
root@565e4a1bdcc0:/# alias
alias what='echo it works'
root@565e4a1bdcc0:/# what
it works

0

উপরের কয়েকটি সমাধান ব্যবহার করেছেন তবে উপকরণগুলি এখনও স্বীকৃত নয়।

আমি ডাক্তারফায়াইল পদক্ষেপের মধ্যে এবং রানটাইমের সময় ধারকগুলিতে দুটি উপকরণ স্থাপন এবং সেগুলি উভয়ই ব্যবহার করার চেষ্টা করছি।

RUN echo "alias model-downloader='python3 ${MODEL_DL_PATH}/downloader.py'" >> ~/.bash_aliases && \
    echo "alias model-converter='python3 ${MODEL_DL_PATH}/converter.py'" >> ~/.bash_aliases && \
    source ~/.bash_aliases

# Download the model
RUN model-downloader --name $MODEL_NAME -o $MODEL_DIR --precisions $MODEL_PRECISION;

আমার জন্য সমাধানটি ছিল ENV ভেরিয়েবলগুলি ব্যবহার করা যা ফোল্ডার পাথ ধরে এবং তারপরে সঠিক নির্বাহযোগ্য যুক্ত করা add আমি খুব বেশি এআরজি ব্যবহার করতে পারতাম তবে আমার আরও পরিস্থিতির জন্য আমার বিল্ড পর্যায়ে এবং পরে রানটাইম উভয় ক্ষেত্রেই এলিয়াসগুলির প্রয়োজন ছিল।

ENV ভেরিয়েবলগুলি ব্যাশ স্ক্রিপ্টের সাথে একযোগে ব্যবহার করুন যা একবার নির্ভরতা দীর্ঘায়িত হয়ে ব্যাশের উত্স নির্ধারণ করে, আরও কিছু এনভির ভেরিয়েবল সেট করে এবং আরও কমান্ডের মাধ্যমে পাইপ সরবরাহ করার অনুমতি দেয়।


প্রতিটি RUNনির্দেশ একটি নতুন শেলের মধ্যে কার্যকর করা হয়, সুতরাং আপনার উদাহরণস্বরূপ যখন আপনি নামটি ব্যবহার করার চেষ্টা করবেন তখন আপনার আর ফাইলটি আর লোড হবে না।
এরিক ড্যানেনবার্গ

১০০% @ এরিকডানেনবার্গ মন্তব্যটির জন্য আপনাকে ধন্যবাদ জানাতে এবং আমাকে এটির একটি স্মরণ করিয়ে দেওয়ার জন্যও ধন্যবাদ যে এটি সম্পর্কে একটি আপডেট পোস্ট করা দরকার - আমি একটি সমাধান উন্মোচিত করেছি এবং এটি আপনার পরামর্শ মত খুব বেশি।
alanionita

0

আপনি ইন্টারেক্টিভভাবে ব্যবহার করেন এমন প্রতিটি ধারকটিতে আপনার উপাধি রাখার জন্য এখানে একটি বাশ ফাংশন রয়েছে।

ducker_it() {
    docker cp ~/bin/alias.sh "$1":/tmp
    docker exec -it "$1" /bin/bash -c "[[ ! -f /tmp/alias.sh.done ]] \
        && [[ -w /root/.bashrc ]] \
        && cat /tmp/alias.sh >> /root/.bashrc \
        && touch /tmp/alias.sh.done"
    docker exec -it "$1" /bin/bash
}

প্রয়োজনীয় পদক্ষেপের আগে:

grep ^alias ~/.zshrc > ~/bin/alias.sh

-1
  1. এই ফাইলটি সম্পাদনা করুন। / .bash_aliases vi ~/.bash_aliases
  2. এই ফাইলটি উত্স করুন। / .bash_aliases source ~/.bash_aliases
  3. সম্পন্ন.

প্রতিবার আপনার ডকারের ধারক স্পিন করার পরে এটি ঠিক আছে তবে পরের বারের মতো উপন্যাসটি থাকবে না। আপনি যদি প্রতিবার এগুলিকে পুনরায় যুক্ত করতে আপত্তি না করেন তবে এই সমাধানটি ভাল।
মিকোপ

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