डॉकरीफाइल में डॉक कंटेनर के लिए बैश उपनाम कैसे सेट करें?


85

मैं नया करने वाला हूं। मैंने पाया कि हम डॉकएफ़ाइल में ईएनवी निर्देश का उपयोग करके पर्यावरण चर सेट कर सकते हैं। लेकिन डॉकरीफाइल में लंबे आदेशों के लिए किसी ने उपनामों को कैसे सेट किया?


उपनामों को अनिवार्य रूप से बहुत लंबे समय के लिए पदावनत माना गया है । एक फ़ंक्शन का उपयोग करें। अब कभी किसी अन्य का उपयोग करने की आवश्यकता नहीं है । यह कैसे है कि 80 के दशक के उत्तरार्ध से ये दृष्टिकोण इतने लंबे समय तक बने रहे?
विलियम पार्सल

19
क्योंकि वे निश्चित रूप से सुविधाजनक और सरल हैं।
आर्थर

13
@WilliamPursell शायद आपको समझाना चाहिए कि इसके बजाय कार्यों का उपयोग कैसे करें।
एरिक डेला क्रूज़

2
उपनाम सरल, सुविधाजनक, नाजुक और त्रुटि प्रवण हैं। कार्य केवल उपयोग करने में आसान हैं, लेकिन अधिक लचीलापन और मजबूती प्रदान करते हैं। इनका उपयोग कैसे करें, इस पर बहुत सारे संसाधन उपलब्ध हैं।
विलियम पर्ससेल जूल

जवाबों:


141

मूल रूप से आप हमेशा ऐसा करते हैं, इसे उपयोगकर्ता से जोड़कर .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 और CMD की तलाश कर रहा था
c24b

5
बैश उर्फ ​​केवल इंटरैक्टिव गोले में काम करता है। बस एक छोटी सी शेल स्क्रिप्ट बनाएं और अपने रास्ते में डालें, एक उपनाम के समान प्रभाव। एक सरल उदाहरण के साथ उत्तर को अपडेट करें।
एरिक डेनबर्ग

1
नोट: stackoverflow.com/a/8467449 से आपको अधिक सुसंगत व्यवहार सुनिश्चित करने के लिए प्रतिध्वनि के बजाय प्रिंटो का उपयोग करना चाहिए । तो Printf '#! / Bin / bash \ necho hello>> / usr / bin / hi chmod + x / usr / bin / hi
barraq

2
खोल स्क्रिप्ट विचार प्यार करता हूँ। उपनाम जोड़ने के लिए देख रहा था, लेकिन यह बहुत बेहतर है। धन्यवाद।
ब्लिज़

3
बचने के लिए कई तर्कों के लिए आपको $ * के बजाय "$ @" का उपयोग करना चाहिए। देखें 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

ज्यादातर समय मैं केवल निर्माण के चरण में उपनामों का उपयोग करता हूं और कंटेनरों के अंदर नहीं जाता हूं, इसलिए पहला उदाहरण हर दिन उपयोग के लिए तेज, स्पष्ट और सरल है।


2

मैंने अभी इसे अपने app.dockerfile में जोड़ा है

# 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

एक इलाज किया!

एक अन्य विकल्प कंटेनर के बाहर से "docker exec -it कमांड" का उपयोग करना है और बस अपने स्वयं के .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
  1. इस फ़ाइल को संपादित करें ~ / .bash_aliases vi ~/.bash_aliases
  2. स्रोत इस फ़ाइल ~ / .bash_aliases source ~/.bash_aliases
  3. किया हुआ।

यह हर बार ठीक है जब आप अपने डॉक कंटेनर को स्पिन करते हैं, लेकिन उपनाम अगली बार नहीं रहेंगे। यदि आप हर बार इस समाधान ठीक है उन्हें फिर से जोड़ने का मन नहीं है।
मिकोप

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;

मेरे लिए समाधान ईएनवी चर का उपयोग करना था जो फ़ोल्डर पथ आयोजित करता था और फिर सटीक निष्पादन योग्य जोड़ देता था। मैं ARG का भी उपयोग कर सकता था, लेकिन अपने अधिक परिदृश्यों के लिए मुझे निर्माण चरण में और बाद में रनटाइम में उपनामों की आवश्यकता थी।

एक bash स्क्रिप्ट के साथ संयोजन के रूप में ENV चर का उपयोग किया जाता है जो एक बार निर्भरता को पॉज़ करने और bash स्रोत को सेट करने के लिए चलता है, कुछ और env चर सेट करता है, और आगे आदेशों को पाइप करने की अनुमति देता है।


हर RUNनिर्देश को एक नए शेल में निष्पादित किया जाता है, इसलिए जब आप उपनाम का उपयोग करने का प्रयास करते हैं तो आपके उदाहरण में उपनाम फ़ाइल अब लोड नहीं होती है।
एरिक डेनबर्ग

100% @ ErikDannenberg टिप्पणी के लिए धन्यवाद और मुझे यह याद दिलाने के लिए भी कि मुझे इस पर एक अपडेट पोस्ट करने की आवश्यकता है - मैंने एक समाधान का खुलासा किया है और यह बहुत पसंद है जैसा आपने सुझाव दिया।
अलानियोनिता

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