डॉक इमेज चलाते समय मैं CMD को कैसे ओवरराइड कर सकता हूं?


123

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

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

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

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

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

जवाबों:


125

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

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

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

docker exec -it $CONTAINER_ID /bin/bash

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


उस पर अमल नहीं करेंगे "/ usr / sbin / apache2ctl / bin / bash"? (क्योंकि आपका उदाहरण एंट्रीपॉइंट को ओवरराइड नहीं करता है, यह डॉकरफाइल में परिभाषित एंट्रीपॉइंट का उपयोग करेगा - या क्या मुझे कुछ याद आ रहा है?)
ताना

क्या ऐसा कुछ है जो शायद पुराने / नए docker संस्करणों के लिए अलग है? यह निश्चित रूप से मेरे लिए प्रविष्टि बिंदु चलाता है: gist.github.com/warpr/26a5cc471dce7fc909021 । यह Ubuntu 13.10 पर docker 0.10.0 का उपयोग कर रहा है।
ताना

4
मुझे पता है कि --entrypoint एंट्रीपॉइंट को ओवरराइड करता है। लेकिन जब मैं --entrypoint का उपयोग करता हूं, तो मैं खाली होने के लिए CMD को कैसे ओवरराइड कर सकता हूं? (बैश के लिए मैं कुछ का उपयोग कर सकता हूं जैसे -i या --login, लेकिन सभी एंट्रीपॉइंट्स जो मैं उपयोग करना चाहता हूं, उनमें एक समतुल्य "डमी" तर्क होगा)।
ताना

1
कम से कम डॉकटर v1.11.1 में यह प्रतीत होता है कि - theentrypoint को ओवरराइड करना भी सीएमडी के सामान्य एप्वाइंटिंग को रोकता है। यह केवल तब होता है जब प्रवेश बिंदु ओवरराइड नहीं होता है।
जैस्मीन हेगमैन

1
वहाँ एक के -iबाद क्यों है $IMAGE?
इयाल लेविन

27

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

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

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

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

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

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

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


उफ़, मैंने एक विस्तार की अनदेखी की। छोटा --loginकरने के अलावा -lमुझे लगता है कि आपका समाधान पहले से ही उतना ही अच्छा है जितना कि यह हो जाता है।
साइमन थम

यहां एक मजेदार बात यह है कि मैंने आज देखा: कमांड को ओवरराइड नहीं किया गया है, इसे जोड़ दिया गया है। यहाँ कंटेनर के अंदर से PS है। ध्यान दें कि मैंने जो कमांड जोड़ी थी वह गूंज "db को सेट कर रही थी" और अंतर्निहित कमांड / usr / bin / geth है। इसके अलावा, मैंने "" होने के लिए प्रवेश बिंदु निर्धारित किया है। 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
पॉल एस

Docker संदर्भ लिंक अब काम नहीं करता - इसके लिए एक स्पष्ट प्रतिस्थापन नहीं पा सकता है।
क्रिस किम्प्टन

मैंने इसे ठीक कर दिया, लेकिन मुझे इसे ढूंढना भी मुश्किल लगा;
साइमन थम

15

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

 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अन्य छवियों के लिए सबसे अधिक संभावना है।


1
सिर्फ एक एडिक्शन शेल कमांड्स को '...'"..."
जैसन बेस्ड रिटेन

या आप जितने चाहें उतने - उतने ही तर्क-वितर्क कर लें
Nick Roz

यह काम नहीं करता है: "निष्पादित: \" - सी \ ": निष्पादन योग्य फ़ाइल $ पथ में नहीं मिली": अज्ञात।
रिचर्ड

कंटेनर में पथ की जांच करें, शायद यह वास्तव में मौजूद नहीं है। अधिकांश चित्र हैं, /bin/shलेकिन आपका वह मामला नहीं हो सकता है।
12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.