डॉकटर-कंपोज़ में "रीस्टार्ट: ऑलवेज" पॉलिसी कैसे काम करती है?


23

मैं इस तरह से PostgreSQL और मेरे आवेदन के साथ फ़ाइल बनाने वाला docker है:

version: '3'

services:
  postgresql:
    image: postgres:9.6.6
    ports:
      - 9932:5432
    expose:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=pass
    restart: always
    volumes:
      - /data:/var/lib/postgresql/data

  myapp:
    image: myapp
    links:
      - postgresql
    depends_on:
      - "postgresql"
    restart: always
    ports:
      - "5000:5000"

समस्या यह है कि restart: alwaysजब मैं कंटेनर को मारता हूं तो नीति काम नहीं करती है (ऐप क्रैश का उपयोग करके ऐप को क्रैश करना docker kill) और डॉकटर-कंपोज मेरे कंटेनर को पुनरारंभ नहीं करता है, भले ही एग्जिट कोड 137 हो । मैं उसी व्यवहार का पालन करता हूं जब मैं restart: on-failureनीति का उपयोग करता हूं । वर्जन 2और 3डॉकटर-कंपोज उसी का व्यवहार करते हैं। मेरा सिस्टम उबंटू सर्वर 16.04 x64 है।

मेरे प्रश्न हैं:

  1. डॉकटर-कम्पोजिट दुर्घटनाग्रस्त (मारे गए) कंटेनर को पुनः आरंभ क्यों नहीं करता है?
  2. अगर रीस्टार्ट पॉलिसी काम करती है तो कैसे जांचें?


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

जवाबों:


20

जब आप डॉकटर किल का उपयोग करते हैं, तो यह अपेक्षित व्यवहार है क्योंकि डॉकटर कंटेनर को पुनरारंभ नहीं करता है: "यदि आप मैन्युअल रूप से एक कंटेनर को रोकते हैं, तो इसकी पुनरारंभ नीति को तब तक अनदेखा किया जाता है जब तक कि डोकर डेमॉन पुनरारंभ नहीं हो जाता है या कंटेनर मैन्युअल रूप से पुनरारंभ नहीं हो जाता है। यह रोकने के लिए एक और प्रयास है। रिस्टार्ट लूप " (संदर्भ)

यदि आप docker stop या docker मार का उपयोग करते हैं, तो आप मैन्युअल रूप से कंटेनर को रोक रहे हैं। आप पुनरारंभ नीतियों के बारे में कुछ परीक्षण कर सकते हैं: docker daemon को पुनरारंभ करना, अपने सर्वर को रिबूट करना, एक कंटेनर के अंदर CMD का उपयोग करना और एक निकास चलाना ...

उदाहरण के लिए यदि मैं अपने कंटेनर को फिर से शुरू करने की नीति के साथ मारता हूं, तो मैं देखता हूं कि यह कोड 137 के साथ बाहर निकल गया है, लेकिन docker ps -a के अनुसार इसे फिर से शुरू नहीं किया गया है, यह बाहर रहता है:

[root@andromeda ~]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   3 minutes ago       Exited (137) 34 seconds ago                       keepalive_redis_1

लेकिन अगर मैं डेमॉन को पुनः आरंभ करता हूं ...

[root@andromeda ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   30 minutes ago      Up 2 seconds        6379/tcp            keepalive_redis_1

जिस कंटेनर को पुनरारंभ नीति के साथ सेट किया गया था, वह फिर से शुरू होता है, जिसे दस्तावेज़ीकरण कहता है, इसलिए डॉक मारने वाला वह तरीका नहीं है जिसे आपको पुनरारंभ नीति का परीक्षण करना चाहिए क्योंकि यह माना जाता है कि आपने जानबूझकर कंटेनर को रोक दिया है और डॉकर फिर से शुरू करने से रोकने का एक तरीका चाहता है। लूप्स, यदि आप इसे मारते हैं, तो आप वास्तव में इसे मारना चाहते हैं।

मुझे निम्नलिखित लिंक मूल्यवान लगे जो विभिन्न संस्करणों में समान व्यवहार दिखाते हैं (इसलिए यह बग नहीं है लेकिन अपेक्षित व्यवहार है):

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