डॉकर कम्पोज़ का उपयोग करके इंटरएक्टिव शेल


271

क्या डॉकटर कम्पोज़ का उपयोग करके कंटेनर में इंटरेक्टिव शेल शुरू करने का कोई तरीका है? मैंने ऐसा कुछ करने की कोशिश की है, मेरे docker-compose.yml में:

myapp:
  image: alpine:latest
  entrypoint: /bin/sh

जब मैं डॉकटर-कंपोज़ का उपयोग करके इस कंटेनर को शुरू करता हूं तो यह तुरंत बाहर निकल जाता है। क्या कोई झंडे हैं जो मैं इंटर्नपॉइंट कमांड में जोड़ सकता हूं, या इंटरएक्टिव शेल के रूप में शुरू करने के लिए और मैप के लिए अतिरिक्त विकल्प?

मुझे पता है कि इसे प्राप्त करने के लिए देशी डॉक कमांड विकल्प हैं, बस अगर यह संभव हो तो केवल डॉकर कम्पोज़ का उपयोग करके।


यह काम करने वाला नहीं है। उदाहरण के लिए, यदि आपके पास /bin/shअपनी रचना फ़ाइल में प्रविष्टि के साथ कई चित्र हैं, तो यह क्या करना चाहिए?
जिओंगबिंग जिन

2
हम्म, क्यों न सिर्फ कई गोले शुरू किए जाएं? उदाहरण के लिए, mysql cli के साथ काम करने के लिए mysql कंटेनर में एक शेल, और बैकअप कमांड चलाने के लिए एक बैकअप कंटेनर में एक शेल?
ड्रब

1
किस बारे में docker-compose run myapp?
इवोबा

1
@ibova समस्या यह docker-compose run myappहै कि यह बंदरगाहों को उजागर नहीं करेगा। तो आपको उपयोग करना है docker-compose run --service-ports myappलेकिन फिर भी यह बहुत सुविधाजनक नहीं है।
मूर्ख

entrypoint: /bin/shहोना चाहिएentrypoint: "/bin/sh"
कोडेंटरी

जवाबों:


341

आपको अपने docker-compose.yml में निम्न पंक्तियों को शामिल करना होगा:

version: "3"
services:
  app:
    image: app:1.2.3
    stdin_open: true # docker run -i
    tty: true        # docker run -t

पहले -iमें docker runऔर दूसरे से मेल खाती है -t


3
यह stdin_openगायब लिंक है, बस मुझे अपेक्षित व्यवहार प्रदान करने के लिए जब मैं अपने एक कंटेनर से जुड़ा हुआ हूं जो पहले से ही एक शेल चल रहा है।
चरनी काये

9
@ फ़ूल, यहां तक ​​कि मुझे भी यही मुद्दा मिला। इसे चलाने के लिए बेहतर हैdocker-compose run <service_name>
Aswath K

4
यह कहाँ जोड़ा गया है? सेवा के अंदर?
समस्या

यह ओपी के सवाल का सबसे अच्छा जवाब लगता है .. क्योंकि मुद्दा यह है कि कंटेनर तुरंत बाहर निकलता है, इसलिए docker execइसे इस्तेमाल करने वाला शेल नहीं मिल रहा है।
रॉयएम

यह मुझे विंडोज पर एक त्रुटि देता है:colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
काउललाइनर

210

डोनर-कम्पोज़ के साथ एक इंटरैक्टिव शेल प्राप्त करने के लिए विहित तरीका उपयोग करना है: docker-compose run --rm myapp

आप सेट कर सकते हैं stdin_open: true, tty: true, हालांकि यह वास्तव में आपको एक उचित शेल नहीं देगा up, क्योंकि सभी कंटेनरों से लॉग को स्ट्रीम किया जा रहा है।

आप भी उपयोग कर सकते हैं

docker exec -ti <container name> /bin/bash

चल कंटेनर पर एक खोल पाने के लिए।


16
ध्यान दें --service-portsकि आपको जोड़ने की आवश्यकता है यदि आप किसी भी पोर्ट को उजागर करते हैं (यानी एक वेब सर्वर के लिए)
एपीएल

9
मैंने अधिक जानकारी प्रदान करने और --rmध्वज जोड़ने के लिए अपना उत्तर अपडेट कर दिया है ताकि कंटेनर निकाल दिया जाए। @ Lynx0123 द्वारा उत्तर सही नहीं है। यदि आप दौड़ते हैं तो आपको एक इंटरैक्टिव शेल नहीं मिलेगा docker-compose up
dnephin

2
विंडोज के लिए डॉकर का उपयोग करने के लिए इसे प्राप्त करने के लिए, मुझे डॉकटर-कंपोज v। 1.9.0 की जरूरत है (गितुब मुद्दा और पीआर देखें )। 12/19/16 तक, यह केवल विंडोज के लिए डोकर के बीटा संस्करणों के साथ जहाज है। फिर docker-compose runकाम करता है। आप command: /bin/bashडॉक-कंपोज़.माइल को भी जोड़ना चाहेंगे।
जोसेफ 238

5
यह शीर्ष उत्तर होना चाहिए। यह वही है जिसकी मुझे तलाश थी जब मैं यहाँ आया था।
मकासबर्ग

8
docker-compose up -d && docker अनुलग्न <
कंटेनर_name

58

निम्नलिखित के साथ आधिकारिक तौर पर आरंभिक उदाहरण ( https://docs.docker.com/compose/gettingstarted/ ) प्राप्त कर रहे हैं docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

आपके द्वारा इसे शुरू करने के बाद docker-compose up, आप अपने redisकंटेनर या अपने webकंटेनर में आसानी से खोल सकते हैं :

docker-compose exec redis sh
docker-compose exec web sh 

44

docker-compose run myapp sh सौदा करना चाहिए।

up/ के साथ कुछ भ्रम है run, लेकिन docker-compose runडॉक्स में बहुत स्पष्टीकरण है: https://docs.docker.com/compose/reference/run


1
बहुत बहुत धन्यवाद। स्पष्ट करने के लिए बस थोड़ा सा जोड़ें। docker-compose रन [आपकी सेवा-नाम-परिभाषित-में-docker-compose.yml] [sh या bash]।
theeranitp

23

डॉकटर-कम्पोज़ का उपयोग करते हुए, मुझे यह करने का सबसे आसान तरीका लगा कि एक docker ps -a(मेरे कंटेनरों को शुरू करने के बाद) करना हैdocker-compose up ) और उस कंटेनर की आईडी प्राप्त करें जिसे मैं एक इंटरैक्टिव शेल में रखना चाहता हूं (चलो इसे xyz123 कहते हैं)।

फिर इसे अंजाम देना एक साधारण बात है docker exec -ti xyz123 /bin/bash

और वॉइला, एक इंटरैक्टिव शेल।


1
यह सुनिश्चित नहीं था कि यह क्यों डाउन-वोट किया गया था - यह कुछ भी गलत होने की स्थिति में डिबगिंग प्राप्त करने का एक शानदार तरीका है, और मैंने इस समाधान को पढ़ने के एक मिनट के भीतर, सफलता के साथ इस पद्धति का उपयोग किया।
इरिकमजल

4
@ericmjl क्योंकि यह एक दो कदम की प्रक्रिया है जहाँ सवाल विशेष रूप से डॉकटर-कम्पोज़ विशेषताओं का उपयोग करने के बारे में पूछा गया था, और पहले से ही दूसरे उत्तर में कहा गया था
OneCricketeer

19

यदि भविष्य में कोई भी यहां से भटकता है:

docker-compose exec container_name sh

या

docker-compose exec container_name bash

या आप सिंगल लाइन्स चला सकते हैं

docker-compose exec container_name php -v

वह यह है कि आपके पास पहले से ही अपने कंटेनर हैं और चल रहे हैं


2

आप docker-compose exec SERVICE_NAME shकमांड लाइन पर कर सकते हैं । आपके SERVICE_NAMEमें परिभाषित किया गया है docker-compose.yml। उदाहरण के लिए,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAME"चिड़ियाघर संचालक" होगा।


2

यह प्रश्न मेरे लिए बहुत दिलचस्प है क्योंकि मुझे समस्याएं हैं, जब मैं निष्पादन के तुरंत बाद कंटेनर चलाता हूं तो तुरंत बाहर निकलता हूं और मैंने -it के साथ तय किया है:

docker run -it -p 3000:3000 -v /app/node_modules -v $(pwd):/app <your_container_id>

और जब मुझे डॉकटर कंपोज़ के साथ इसे स्वचालित करना होगा:

version: '3'
services:
    frontend:
        stdin_open: true
        tty: true
        build: 
            context: .
            dockerfile: Dockerfile.dev
        ports: 
            - "3000:3000"
        volumes: 
            - /app/node_modules
            - .:/app

यह चाल बनाता है: stdin_open: true, tty: true

यह एक प्रोजेक्ट है जो create-react-app के साथ जेनरेट होता है

Dockerfile.dev ऐसा लगता है कि:

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . . 

CMD ["npm", "run", "start"]

आशा है कि यह उदाहरण डॉकटर कंटेनर में फ्रंटएंड (उदाहरण में प्रतिक्रिया) को चलाने के लिए अन्य मदद करेगा।


0

तो ymlकहा जाता है docker-compose.ymlयह एक साधारण के साथ शुरू किया जा सकता $ docker-compose up। एक टर्मिनल का संगत लगाव बस हो सकता है (विचार करें कि ymlएक सेवा निर्दिष्ट की गई है myservice):

$ docker-compose exec myservice sh

हालाँकि, यदि आप किसी भिन्न ymlफ़ाइल नाम का उपयोग कर रहे हैं , जैसे कि docker-compose-mycompose.yml, तो इसका उपयोग करके लॉन्च किया जाना चाहिए $ docker-compose -f docker-compose-mycompose.yml up। एक इंटरैक्टिव टर्मिनल संलग्न करने के लिए आपको ymlफ़ाइल भी निर्दिष्ट करनी होगी , जैसे:

$ docker-compose -f docker-compose-mycompose.yml exec myservice sh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.