डॉकटर कंपोज कंटेनर को चालू रखते हैं


101

मैं डॉकटर-कंपोज के साथ एक सेवा शुरू करना चाहता हूं और कंटेनर को चालू रखना चाहता हूं ताकि मैं इसका आईपी-पता 'डॉकर्स इंस्पेक्ट' के माध्यम से प्राप्त कर सकूं। हालांकि, कंटेनर हमेशा शुरू होने के बाद सही बाहर निकलता है।

मैंने "कमांड: [" स्लीप "," 60 "] और अन्य चीजों को docker-compose.yml में जोड़ने की कोशिश की, लेकिन जब भी मैं" कमांड: "के साथ लाइन जोड़ता हूं ..." I cant कॉल "docker-compose up" जैसा कि मुझे संदेश "कंटेनर प्रारंभ नहीं कर सकता ..... सिस्टम त्रुटि: अमान्य वर्ण 'k' मान की शुरुआत के लिए देख रहा है"

मैंने "सीएमडी स्लीप 60" को जोड़ने की कोशिश की और खुद डॉकरफाइल को व्हाट्सएप नहीं किया, लेकिन इन आदेशों को निष्पादित नहीं किया गया।

क्या कंटेनर को जीवित रखने या मेरी समस्याओं में से एक को ठीक करने का एक आसान तरीका है?

संपादित करें: यहाँ कम्पोज़ फ़ाइल है जिसे मैं चलाना चाहता हूँ:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

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

अगर मैं डॉकरफाइल के साथ दृष्टिकोण की कोशिश करता हूं, तो डॉकरफाइल ऐसा दिखता है:

FROM ubuntu:latest
CMD ["sleep", "60"]

जो कुछ करता प्रतीत न हो

EDIT 2: मुझे खुद को सही करना है, यह पता चला कि डॉकफेरफाइल और डॉकटर-कंपोज के साथ भी यही समस्या थी। हर बार जब मैं डॉकफेरफिल में "सीएमडी ..." जोड़ता हूं या "कमांड ..." जोड़ता हूं। रचना फ़ाइल, मुझे अमान्य वर्ण के साथ त्रुटि मिली। यदि मैं दोनों कमांड हटाता हूं, तो यह त्रुटिपूर्ण रूप से काम करता है।


1
कृपया docker-compose.yml, Dockerfile, और कोई भी स्क्रिप्ट जिसे आप डीबग करने का प्रयास कर रहे हैं शामिल करें।
BMitch

जवाबों:


128

कंटेनर को चालू रखने के लिए जब आप इसे शुरू करते हैं docker-compose, तो निम्न कमांड का उपयोग करें

command: tail -F anything

तो आपका docker-compose.yml बन जाता है

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

और आप निम्नलिखित कमांड का उपयोग करके कंटेनर में जाने के लिए एक शेल चला सकते हैं

docker exec -i -t composename_my-test_1 bash

composenameवह नाम कहां है जो docker-composeआपके कंटेनरों तक पहुंचता है।


1
जब आप इसके साथ काम करते हैं तो आप कंटेनर को कैसे रोकते हैं? क्या Ctrl + C, Ctrl + Z प्रकार की कमांड है? अभी मुझे नौकरी छोड़ने के लिए टर्मिनल बंद करना है।
mac10688

यदि आप कंटेनर के अंदर हैं, तो आप exitअपने मेजबान मशीन पर वापस जाने के लिए टाइप कर सकते हैं। यदि आप अपने होस्ट पर हैं, तो आप Docker ( docker stop composename_my-test_1) या Docker Compose ( docker-compose stop) का उपयोग करके कंटेनर को रोक सकते हैं ।
निक सेटजे

2
@ Alexis.Rolland यदि आप एक नया SO प्रश्न पूछना चाहते हैं और कुछ और विवरण साझा करना चाहते हैं, तो मैं एक बार देखने के लिए खुश हूं। मेरा अनुमान है कि आपकी त्रुटि का आपके कंटेनर में से एक के आंतरिक मामलों के साथ कुछ करना है, जैसा कि डॉकर या आपके मेजबान ऑपरेटिंग सिस्टम के साथ एक समस्या के विपरीत है।
निक सेटजे

1
@ mac10688 अगर आपके अटैच्ड कंटेनर सेशन में कोई प्रॉब्लम नहीं है, तो ctrl-d को अलग करने की कोशिश करें
Stark

7
/dev/nullanythingटेल कमांड रेफ के लिए जगह में बेहतर होगा । stackoverflow.com/a/48732671/248616
नाम जी VU

90

आप ttyकॉन्फ़िगरेशन विकल्प का उपयोग कर सकते हैं ।

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

नोट: यदि आप छवि के लिए Dockerfile का उपयोग करते हैं और CMDDockerfile में, यह विकल्प काम नहीं करेगा; हालाँकि, आप कंपोज़ entrypointफ़ाइल में विकल्प का उपयोग कर सकते हैं जो CMDDockerfile से साफ़ करता है ।


9
यह काम करता है, और की तुलना में कम hacky लगता है tail -f /dev/null। इसके साथ, मैं एक कंटेनरीकृत देव वातावरण को चलाने में सक्षम हूं, जिसमें एक पोस्टग्रैज डेटाबेस के साथ जुड़ा हुआ है docker-compose upऔर एक दूसरे टर्मिनल के माध्यम से शेल का उपयोग कर चला रहा है docker exec
Psiloc

1
जबकि वर्तमान में अच्छी तरह से प्रलेखित नहीं है। यह एक आधिकारिक विकल्प है जो समान प्रभाव को प्राप्त करेगा tail -f /dev/nullया tail -f anything, यहाँ देखें: docs.docker.com/compose/compose-file
b01

2
@ABMRuman & Psiloc, यह केवल तभी काम करता है जब आप डॉकटर-कंपोज़.माइल फ़ाइल में "कमांड" का उपयोग नहीं करते हैं। "कमांड" का उपयोग करते समय आपको एक और हैक की आवश्यकता होती है - इसलिए पूंछ-एफ हैक यहां पूरी तरह से अनुकूल है।
हीफेल

1
यदि आप डॉकटराइल में प्रविष्टि बिंदु का उपयोग करते हैं तो यह सबसे अच्छा उत्तर होना चाहिए।
डीडीकेवी 587

54

GitHub 26 अगस्त, 2015 को @aand की टिप्पणी के आधार पर , कोई tail -f /dev/nullकंटेनर को चालू रखने के लिए डॉक-कंपोज़ में उपयोग कर सकता है ।

docker-compose.yml उदाहरण

version: '3'
services:
  some-app:
    command: tail -f /dev/null

यह आज्ञा क्यों?

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


2
वास्तव में यह आदेश क्यों? क्या यह दूसरों की तुलना में बेहतर बनाता है? मेरे मामले में बस एक बैश शुरू करने के साथ ही चाल
चली

@ N4ppeL अच्छा सवाल। इस विकल्प को चुनने का एकमात्र कारण यह था कि इसे जीथब पर बहुत सारे अंगूठे प्राप्त हुए थे, लेकिन उच्चतम मतदान का मतलब यह नहीं है कि यह सबसे अच्छा जवाब है। दूसरा कारण एक व्यावहारिक था क्योंकि मुझे समय सीमा के कारण मामले को जल्द से जल्द हल करना था।
0:30

17
  • नामक एक फ़ाइल बनाएँ docker-compose.yml
  • फ़ाइल में निम्न जोड़ें
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • उसी निर्देशिका में रहकर, docker-compose up -dटर्मिनल से चलाएं
  • docker psकंटेनर आईडी या नाम प्राप्त करने के लिए चलाएँ
  • तुम दौड़ सकते हो docker inspect $container_id
  • आप कंटेनर में प्रवेश कर सकते हैं और बैश शेल चला सकते हैं docker-compose exec ubuntu /bin/bashयाdocker-compose exec ubuntu /bin/sh
  • जब किया जाता है, तो सुनिश्चित करें कि आप कंटेनर के बाहर हैं और चला रहे हैं docker-compose down

my-docker-shell.shडॉक कम्पोज़ फ़ाइल बनाने के लिए यहां एक छोटी बैश स्क्रिप्ट ( ) है, कंटेनर को चलाएं, कंटेनर में लॉग इन करें और अंत में डॉकटर कंटेनर को साफ़ करें और जब आप लॉग आउट करें तो डॉकटर फ़ाइल को लिखें।

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

1
हालांकि यह सवाल का वास्तविक जवाब नहीं था, मुझे यह बहुत मूल्यवान लगा! मैं इस दृष्टिकोण के लिए वैश्विक bashrc फ़ंक्शंस का उपयोग करने के लिए आगे बढ़ गया: gist.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14db4ae8bd
loopmode

8

Dockerfile में आप कमांड का उपयोग कर सकते हैं:

{CMD sleep infinity}

2

जैसा कि टिप्पणीकार ने कहा, हमें आपको पूर्ण उत्तर देने के लिए प्रश्न में Dockerfile देखना होगा, लेकिन यह एक बहुत ही सामान्य गलती है। मैं बहुत गारंटी दे सकता हूं कि आप जिस कमांड को चलाने की कोशिश कर रहे हैं वह एक पृष्ठभूमि प्रक्रिया शुरू कर रहा है। यह वह आदेश हो सकता है जिसे आप गैर-डॉकर स्थितियों में चलाएंगे, लेकिन डॉकरफाइल में ऐसा करना गलत है। उदाहरण के लिए, यदि आप जो चल रहे हैं वह आमतौर पर एक सिस्टम सेवा के रूप में परिभाषित किया गया है, तो आप "systemctl start" जैसी किसी चीज़ का उपयोग कर सकते हैं। वह पृष्ठभूमि में प्रक्रिया शुरू करेगा, जो काम नहीं करेगा। आपको प्रक्रिया को अग्रभूमि में चलाना होगा, इसलिए पूरी प्रक्रिया अवरुद्ध हो जाएगी।


0

बस एक त्वरित नोट

मैंने एकल छवि के आधार पर परीक्षण किया है golang, इसलिए जब मैं docker-compose downयहां फोन करता हूं तो मुझे क्या मिलता है:

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

मेरी प्रणाली की जानकारी:

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

ठीक है मैंने अपनी गलती पाई। Dockerfile में कंपोज़ के लिए उपयोग की जाने वाली छवि के लिए मैंने निर्दिष्ट किया कि बेस इमेज को ubuntu: नवीनतम होना चाहिए, लेकिन मैंने पहले खुद द्वारा ubuntu नामक एक छवि बनाई थी और उस छवि ने काम नहीं किया। इसलिए मैंने मूल ubuntu छवि का उपयोग नहीं किया, बल्कि मेरी स्वयं की छवि के एक भ्रष्ट संस्करण को भी ubuntu कहा जाता है।

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