सवाल डॉकर छवि चलाते समय मैं सीएमडी को ओवरराइड कैसे कर सकता हूं?


मैं किसी अन्य व्यक्ति द्वारा एन्टरपॉइंट और सीएमडी निर्दिष्ट दोनों के साथ बनाई गई डॉकर छवि का निरीक्षण करना चाहता हूं, उदाहरण के लिए:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

मैं वर्तमान में करता हूं:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

क्या सीएमडी खाली होने के लिए ओवरराइड करने का कोई तरीका है (इसलिए मुझे "--login" का उपयोग करने की ज़रूरत नहीं है)?


82
2018-05-10 12:59


मूल




जवाब:


आप बस के माध्यम से प्रवेश कर सकते हैं docker run -it --entrypoint=/bin/bash $IMAGE -i (आप छवि से एक नया कंटेनर लॉन्च करेंगे और इंटरैक्टिव मोड में बैश खोल प्राप्त करेंगे), फिर उस कंटेनर में एंट्रीपॉइंट कमांड चलाएं।

फिर आप राज्य में चल रहे कंटेनर का निरीक्षण कर सकते हैं, इसे चलाना चाहिए।

संपादित करें: डॉकर 1.3 के बाद से आप इसका उपयोग कर सकते हैं exec एक चल रहे कंटेनर में एक प्रक्रिया चलाने के लिए। अपने कंटेनर को शुरू करें जैसा कि आप सामान्य रूप से करते हैं, और फिर जारी करके इसे दर्ज करें:

docker exec -it $CONTAINER_ID /bin/bash

मान लें कि बैश स्थापित है, आपको चल रहे कंटेनर में खोल पहुंच दी जाएगी।


90
2018-05-12 09:28



क्या वह "/ usr / sbin / apache2ctl / bin / bash" निष्पादित नहीं करेगा? (क्योंकि आपका उदाहरण एंट्रीपॉइंट को ओवरराइड नहीं करता है, यह डॉकरफ़ाइल में परिभाषित एंट्रीपॉइंट का उपयोग करेगा - या क्या मुझे कुछ याद आ रहा है?) - warp
क्या वह ऐसा कुछ है जो पुराने / नए डॉकर संस्करणों के लिए अलग है? यह निश्चित रूप से मेरे लिए प्रवेश बिंदु चलाता है: gist.github.com/warpr/26a5cc471dce7fcf9021 । यह उबंटू 13.10 पर डॉकर 0.10.0 का उपयोग कर रहा है। - warp
पासिंग -entrypoint एंट्रीपॉइंट ओवरराइड करता है। संपादित उत्तर देखें - Panagiotis Moustafellos
मुझे पता है - passrypoint प्रविष्टि बिंदु ओवरराइड करता है। लेकिन जब मैं --entrypoint का उपयोग करता हूं, तो मैं खाली होने के लिए सीएमडी को कैसे ओवरराइड कर सकता हूं? (बैश के लिए मैं -i या --login जैसे कुछ का उपयोग कर सकता हूं, लेकिन मेरे द्वारा उपयोग किए जाने वाले सभी एंट्री पॉइंट्स के बराबर "डमी" तर्क नहीं होगा)। - warp
कम से कम डॉकर v1.11.1 में ऐसा प्रतीत होता है कि --entrypoint को ओवरराइड करने से सीएमडी को एंट्रीपॉइंट में सामान्य जोड़ना भी रोकता है। ऐसा तब होता है जब प्रविष्टि बिंदु ओवरराइड नहीं होता है। - Jasmine Hegman


देख: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

प्रासंगिक हिस्सा:

सीएमडी (डिफ़ॉल्ट कमांड या विकल्प) डॉकर कमांडलाइन में वैकल्पिक कमांड याद रखें:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

यह आदेश वैकल्पिक है क्योंकि जिस व्यक्ति ने IMAGE बनाया है, वह पहले से ही डॉकरफ़ाइल सीएमडी का उपयोग करके एक डिफ़ॉल्ट COMMAND प्रदान कर सकता है। ऑपरेटर (छवि से कंटेनर चलाने वाला व्यक्ति) के रूप में, आप केवल एक नया COMMAND निर्दिष्ट करके उस सीएमडी को ओवरराइड कर सकते हैं।

यदि छवि एक एंटरपॉइंट निर्दिष्ट करती है तो सीएमडी या COMMAND को एंटरपॉइंट के लिए तर्क के रूप में जोड़ा जाता है।

तो आप जो चाहते हैं उसे करने के लिए आपको चाहिए केवल एक cmd निर्दिष्ट करें, और उपयोग ओवरराइड करें /bin/bash। काफी "खाली" नहीं है, लेकिन यह काम 99% किया जाता है।


19
2018-06-12 07:31



ओह, मैंने एक विस्तार को अनदेखा किया। शॉर्टिंग के अलावा --loginसेवा मेरे -l मुझे लगता है कि आपका समाधान पहले से ही उतना ही अच्छा है जितना इसे मिलता है। - Simon Thum
यहां एक मजेदार चीज है जो मैंने आज देखी: कमांड को ओवरराइड नहीं किया गया है, यह जोड़ा गया है। कंटेनर के अंदर से पीएस यहाँ है। ध्यान दें कि मैंने जो आदेश जोड़ा था वह "डीबी सेट अप करना" था और अंतर्निहित कमांड / usr / bin / geth है। इसके अलावा मैंने एंट्रीपॉइंट को "" सेट किया है। 1 ? Ssl 0:00 /usr/bin/geth echo setting up db - Paul S
डॉकर संदर्भ लिंक अब काम नहीं करता है - इसके लिए एक स्पष्ट प्रतिस्थापन नहीं मिल सकता है। - Chris Kimpton
मैंने बस इसे ठीक किया, लेकिन मुझे यह भी ढूंढना मुश्किल हो गया; ( - Simon Thum


प्रविष्टि बिंदु को ओवरराइड करने के लिए यहां आने वाले किसी भी व्यक्ति के लिए और अन्य आदेश पास करने के लिए आदेश, उदा। एंट्रीपॉइंट स्क्रिप्ट के बजाए रन बैश करें और फिर पैरामीटर के साथ कुछ अन्य कमांड चलाएं (अन्य उत्तरों से मुझे स्पष्ट नहीं था):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' के लिए पैरामीटर है /bin/sh तो यहां आप किसी भी कमांड को पास कर सकते हैं जिसे आप कंटेनर में चलाना चाहते हैं। /bin/sh अल्पाइन छवियों के लिए है, /bin/bash अन्य छवियों के लिए सबसे अधिक संभावना है।


7
2018-05-04 07:28



केवल एक एडिशन शेल कमांड जेसन आधारित लेख होना चाहिए, इसलिए सिंगल कोट्स के साथ उद्धरण के बजाय '...' डबल कोट्स का प्रयोग करें "..." - Jimmy Obonyo Abor