আমি ডকারে নতুন আমি দেখেছি যে আমরা ডকফাইফিলে ENV নির্দেশ ব্যবহার করে পরিবেশের পরিবর্তনগুলি সেট করতে পারি। তবে কীভাবে একজন ডকফাইফিলে লম্বা কমান্ডের জন্য বাশকে উপকরণ দেয়?
আমি ডকারে নতুন আমি দেখেছি যে আমরা ডকফাইফিলে ENV নির্দেশ ব্যবহার করে পরিবেশের পরিবর্তনগুলি সেট করতে পারি। তবে কীভাবে একজন ডকফাইফিলে লম্বা কমান্ডের জন্য বাশকে উপকরণ দেয়?
উত্তর:
মূলত আপনি যেমন সর্বদা করেন, ব্যবহারকারীর সাথে এটি যুক্ত করে .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
বিদ্যমান কমান্ডের একটি উপনাম তৈরি করতে, এটি ব্যবহার করতে পারে ln -s
:
ln -s $(which <existing_command>) /usr/bin/<my_command>
alias ll='ls -lh'
যা সিমলিঙ্কগুলি দিয়ে সম্ভব নয়।
আপনি যদি কেবল ডকফাইফিলে এলিয়াস ব্যবহার করতে চান তবে কনটেইনারটির মধ্যে না থেকে তবে সবচেয়ে সংক্ষিপ্ততম উপায়টি হ'ল 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
আমি কেবল এটি আমার অ্যাপ্লিকেশনটিতে যুক্ত করেছি 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
আপনি এন্ট্রিপয়েন্টটি ব্যবহার করতে পারেন, তবে এটি আপনার ডকফাইফিলে, উলের জন্য কাজ করবে না:
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 "$@"
(দ্রুত কপি / পেস্ট করুন, দুঃখিত)
আমি মনে করি সবচেয়ে সহজ উপায় হ'ল আপনার কনটেইনারটিতে কোনও ফাইল আপনার এলিয়াসযুক্ত মাউন্ট করা এবং তারপরে বাশটি কোথায় খুঁজে পাওয়া উচিত তা নির্দিষ্ট করে:
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
উপরের কয়েকটি সমাধান ব্যবহার করেছেন তবে উপকরণগুলি এখনও স্বীকৃত নয়।
আমি ডাক্তারফায়াইল পদক্ষেপের মধ্যে এবং রানটাইমের সময় ধারকগুলিতে দুটি উপকরণ স্থাপন এবং সেগুলি উভয়ই ব্যবহার করার চেষ্টা করছি।
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
নির্দেশ একটি নতুন শেলের মধ্যে কার্যকর করা হয়, সুতরাং আপনার উদাহরণস্বরূপ যখন আপনি নামটি ব্যবহার করার চেষ্টা করবেন তখন আপনার আর ফাইলটি আর লোড হবে না।
আপনি ইন্টারেক্টিভভাবে ব্যবহার করেন এমন প্রতিটি ধারকটিতে আপনার উপাধি রাখার জন্য এখানে একটি বাশ ফাংশন রয়েছে।
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
vi ~/.bash_aliases
source ~/.bash_aliases