นโยบาย“ รีสตาร์ท: เสมอ” ทำงานอย่างไรในนักเขียนที่เรียบง่าย?


23

ฉันมีนักเทียบท่าเขียนไฟล์กับ PostgreSQL และแอปพลิเคชันของฉันเช่นนี้:

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องค์ประกอบนักเทียบท่าทำงานเหมือนกัน ระบบของฉันคือ Ubuntu Server 16.04 x64

คำถามของฉันคือ:

  1. ทำไมนักแต่งเพลงไม่รีสตาร์ทคอนเทนเนอร์ (ถูกฆ่า) ที่เสียหาย
  2. จะตรวจสอบได้อย่างไรว่านโยบายการรีสตาร์ททำงานได้อย่างไร


1
ฉันอยู่ที่นั่นหลายครั้ง แต่อย่างที่คุณเห็นเอกสารไม่แข็งแรงและไม่มีคำอธิบายว่าคุณสมบัตินี้ทำงานอย่างไรฉันจึงถามคำถาม - ฉันอยากเห็นคำตอบจากคนที่มีประสบการณ์จริงในสาขานี้
Marcin Zablocki

คำตอบ:


20

เมื่อคุณใช้นักฆ่านักฆ่านี่เป็นลักษณะการทำงานที่คาดไว้เนื่องจากนักเทียบท่าไม่รีสตาร์ทคอนเทนเนอร์: "ถ้าคุณหยุดคอนเทนเนอร์ด้วยตนเองนโยบายการรีสตาร์ทจะถูกละเว้นจนกระทั่ง Docker daemon รีสตาร์ทหรือรีสตาร์ทคอนเทนเนอร์ด้วยตนเอง รีสตาร์ทลูป " (อ้างอิง)

หากคุณใช้นักเทียบท่าหยุดหรือนักฆ่านักฆ่าคุณจะหยุดภาชนะด้วยตนเอง คุณสามารถทำการทดสอบบางอย่างเกี่ยวกับนโยบายการรีสตาร์ท: การรีสตาร์ท Docker daemon รีบูตเซิร์ฟเวอร์ของคุณโดยใช้ CMD ภายในคอนเทนเนอร์และออกจากการทำงาน ...

ตัวอย่างเช่นถ้าฉันฆ่าที่เก็บของฉันปรับใช้กับนโยบายการเริ่มต้นใหม่ฉันเห็นว่ามันออกมาด้วยรหัส 137 แต่มันไม่ได้รีสตาร์ทตามนักเทียบท่า 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

คอนเทนเนอร์ที่ถูกตั้งค่าด้วยนโยบายการเริ่มต้นใหม่เริ่มต้นอีกครั้งซึ่งเป็นสิ่งที่เอกสารพูดดังนั้นนักฆ่านักฆ่าไม่ใช่วิธีที่คุณควรทดสอบนโยบายการเริ่มระบบใหม่เนื่องจากมันสันนิษฐานว่าคุณได้หยุดการทำงานอย่างตั้งใจและนักเทียบท่าต้องการวิธีป้องกันการเริ่มต้นใหม่ ลูปถ้าคุณฆ่าคุณต้องการฆ่ามันจริงๆ

ฉันพบลิงค์ต่อไปนี้มีค่าที่แสดงพฤติกรรมเดียวกันในเวอร์ชันต่างๆ (ดังนั้นจึงไม่ใช่ข้อผิดพลาด แต่เป็นพฤติกรรมที่คาดหวัง):

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.