Bagaimana cara kerja kebijakan" restart: always " di docker-compose?

Saya memiliki file Docker compose dengan PostgreSQL dan aplikasi saya, seperti ini:

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"

Masalahnya adalah bahwa restart: always kebijakan tampaknya tidak berfungsi saat saya mematikan penampung (mensimulasikan kerusakan aplikasi menggunakan docker kill) dan docker-compose tidak memulai ulang wadah saya, meskipun Kode keluar adalah 137. Saya mengamati perilaku yang sama ketika saya menggunakan restart: on-failure kebijakan. Versi 2 dan 3 dari docker-compose berperilaku sama. Sistem saya adalah Ubuntu Server 16.04 x64.

Pertanyaan saya adalah:

  1. Mengapa docker-compose tidak memulai ulang wadah yang rusak (mati)?
  2. Bagaimana cara memeriksa apakah kebijakan restart berfungsi?

Saat Anda menggunakan docker kill, ini adalah perilaku yang diharapkan karena Docker tidak memulai ulang penampung: "jika Anda menghentikan penampung secara manual, kebijakan mulai ulang diabaikan hingga daemon Docker dimulai ulang atau penampung dimulai ulang secara manual. Ini adalah upaya lain untuk mencegah loop restart" (referensi)

Jika Anda menggunakan docker stop atau docker kill, Anda menghentikan penampung secara manual. Anda dapat melakukan beberapa tes tentang kebijakan restart: restart daemon docker, reboot server Anda, menggunakan CMD di dalam wadah dan menjalankan keluar...

Misalnya jika saya mematikan wadah saya yang digunakan dengan kebijakan restart, saya melihat bahwa itu keluar dengan kode 137 tetapi tidak dimulai ulang menurut docker ps-A, itu tetap keluar:

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

Tetapi jika saya me-restart daemon...

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

Wadah yang disetel dengan kebijakan restart, dimulai lagi seperti yang dikatakan dokumentasi, jadi docker kill bukanlah cara Anda harus menguji kebijakan restart karena diasumsikan bahwa anda sengaja menghentikan wadah dan Docker ingin memiliki cara untuk mencegah restart loop, jika Anda membunuhnya, Anda benar-benar ingin membunuhnya.

Saya menemukan tautan berikut berharga yang menunjukkan perilaku yang sama dalam versi yang berbeda (jadi ini bukan bug tetapi perilaku yang diharapkan):

Saya ada di sana berkali - kali, tetapi seperti yang anda lihat, dokumentasinya tidak kuat dan tidak ada penjelasan bagaimana fitur ini bekerja, itu sebabnya saya mengajukan pertanyaan-saya ingin melihat jawaban dari seseorang dengan pengalaman langsung di bidang ini.

Compose specification | Docker Documentation & Compose specification | Docker Documentation