নতুন লাইন সংরক্ষণের সময় ডকফাইলে একাধিক লাইন দিয়ে কমান্ড কীভাবে লিখবেন?


86

আমি ডকফাইফাইলে নিম্নলিখিত রুন কমান্ডটি লিখতে চাই। তবে, ডকার নতুন লাইনগুলি সংরক্ষণ করছে না।

RUN echo "[repo] \
name            = YUM Repository \
baseurl         = https://example.com/packages/ \
enabled         = 1 \
gpgcheck        = 0" > /etc/yum.repos.d/Repo.repoxyz

আমি জানি যে \প্রতিটি লাইনের শেষে নতুন লাইনটি পলায়ন করে। তবে, নতুন লাইনের সংরক্ষণের জন্য আমি একাধিক লাইন লিখতে পারি এমন কোনও উপায় আছে কি?


আপনি কি নন * নিক্স প্ল্যাটফর্ম ব্যবহার করছেন? কারণ এটি লিনাক্সে আমার পক্ষে ঠিক কাজ করে।
ব্যবহারকারী

@ ব্যবহারকারী, আমি লিনাক্স ব্যবহার করছিলাম।
ভেঙ্কটা জাসওয়ানথ

উত্তর:


115

আপনি "এএনএসআই-সি উদ্ধৃতি" যার সাথে পরিচিত তা ব্যবহার করতে পারেন $'...'এটি মূলত একটি ksh93 বৈশিষ্ট্য ছিল তবে এটি এখন ব্যাশ, zsh, mksh, FreeBSD sh এবং ব্যস্তবক্সের ছাইতে উপলব্ধ (তবে কেবল এটি ENABLE_ASH_BASH_COMPAT দিয়ে সংকলিত থাকলে)।

হিসাবে চালান ব্যবহার /bin/shডিফল্টরূপে শেল হিসাবে আপনাকে প্রথমে শেল নির্দেশ ব্যবহার করে ব্যাশ ভালো কিছু করার জন্য সুইচ করার প্রয়োজন হয়।

আপনার কমান্ডটি দিয়ে শুরু করুন $', এটি দিয়ে শেষ করুন 'এবং \n\নতুন লাইনের জন্য ব্যবহার করুন :

SHELL ["/bin/bash", "-c"]

RUN echo $'[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0' > /etc/yum.repos.d/Repo.repoxyz

4
এটি বাশ সিনট্যাক্স। : আরও তথ্যের জন্য এই প্রশ্ন দেখতে পাবেন stackoverflow.com/a/11966402/1395437
ড্যানিয়েল Zolnai

13
দয়া করে, আপনি কী করছেন তা ব্যাখ্যা করুন, কেবল একটি অস্বচ্ছ সমাধানটি ফেলে দেবেন না
ouডার্ড লোপেজ

25
সাবধানতার একটি শব্দ: $' ... \n\ কৌশলটি শেকের উপর নির্ভর করে যা ডকার RUNহচ্ছে bash। কিছু সিস্টেমে (যেমন উবুন্টু) শানটি রুন ব্যবহার করে /bin/shযা প্রায়শই একটি লিঙ্ক dashযা না হয় bashএবং $'বাক্য গঠনটি বোঝে না ।
আনন

4
@ অনন যেমন বলেছে, বাশ ছাড়া অন্য কোথাও চালানো গেলে এটি কাজ করবে না। ( Oh My Zshউভয়ই কাজ করে না )
রাফা

4
@ তবে এটি আলপাইন লিনাক্সে (বর্তমানে আমি ৩.১০.২.২০১ am তে) কাজ করে যা শেল ব্যবহার করে।
যেমন

53

আমি ব্যবহৃত printf। "\ N" ব্যবহার করে সমস্ত পাঠ্য এক লাইনে লেখা।

কার্যকর করা হচ্ছে:

RUN printf 'example \ntext \nhere' >> example.txt

সন্নিবেশ:

example
text
here

উদাহরণস্বরূপ। txt


19

তুমি ব্যবহার করতে পার:

RUN echo -e "\
[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0\
" > /etc/yum.repos.d/Repo.repoxyz

এইভাবে আপনার ফাইলগুলির বিষয়বস্তু কী তা যাচাই করার একটি দ্রুত উপায় থাকবে have আপনার কেবল সচেতন হওয়া দরকার যে আপনাকে প্রতিটি লাইনটি শেষ করে শেষ করতে হবে \এবং \nযখন প্রয়োজন হবে তখন সন্নিবেশ করা উচিত ।


4
এর echo -eঅর্থ ব্যাখ্যা করা দরকার\n
প্যাট্রিক বার্গনার

7

নতুন লাইনটি \nকাজ না করায় আমি উপরে তালিকাভুক্ত উদাহরণগুলির সংমিশ্রণটি ব্যবহার করে শেষ করেছি echo

RUN printf 'example \n\
text \n\
here' >> example.txt

এটি প্রত্যাশিত হিসাবে নিম্নলিখিতটি উত্পাদন করে:

example
text
here

4
আপনার উত্তরটি সিটিডির উত্তর থেকে কীভাবে আলাদা?
গডফাদার

@ দ্য গডফাদার এটি একটি বহুমুখী উদাহরণ। আরও ভাল মূল প্রশ্নের উত্তর।
সের্গেই

2

এটি আপনাকে সহায়তা করতে পারে ( https://github.com/jen-soft/pydocker) )

[ডকফেরফাইল.পি]

from pydocker import DockerFile  # sudo pip install -U pydocker

d = DockerFile(base_img='debian:8.2', name='jen-soft/custom-debian:8.2')

d.RUN_bash_script('/opt/set_repo.sh', r'''
cat >/etc/apt/sources.list <<EOL
deb     http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main
EOL
apt-get clean && apt-get update
''')

d.EXPOSE = 80
d.WORKDIR = '/opt'
d.CMD = ["python", "--version"]

# d.generate_files()
d.build_img()

# sudo wget -qO- https://get.docker.com/ | sh

python Dockerfile.py
docker images

-1

আপনি আপনার ফাইলটি সম্পূর্ণ করতে বেশ কয়েকবার আরআনকে চালিত করতে পারেন:

RUN echo "[repo]" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "name            = YUM Repository" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "baseurl         = https://example.com/packages/" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "enabled         = 1" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "gpgcheck        = 0" >> /etc/yum.repos.d/Repo.repoxyz

এটি সর্বোত্তম সমাধান হতে পারে না কারণ এটি প্রতিটি আরএন কমান্ডের জন্য একটি নতুন স্তর তৈরি করে। তবুও, প্রতিটি স্তরটি আপনি যে পরিবর্তন করবেন তার চেয়ে বড় হবে, যা এই ক্ষেত্রে এটি বাইটসের ক্রম (প্রথম আরএনআর স্তরটি 7-বাইট হওয়া উচিত)।

এই সমাধানটির সুবিধাটি হ'ল এটি সমস্ত শেলগুলির সাথে কাজ করবে।


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