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

23

Saya memiliki file komposisi buruh pelabuhan 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: alwayskebijakan tampaknya tidak berfungsi ketika saya membunuh kontainer (mensimulasikan penggunaan aplikasi 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-failurekebijakan. Versi 2dan 3komposisi buruh pelabuhan berperilaku sama. Sistem saya adalah Ubuntu Server 16.04 x64.

Pertanyaan saya adalah:

  1. Mengapa docker-compose tidak memulai ulang wadah yang jatuh (terbunuh)?
  2. Bagaimana cara memeriksa apakah kebijakan restart berfungsi?
Marcin Zablocki
sumber
1
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 yang berpengalaman dalam bidang ini.
Marcin Zablocki

Jawaban:

20

Ketika Anda menggunakan buruh pelabuhan, ini adalah perilaku yang diharapkan karena Docker tidak memulai ulang wadah: "Jika Anda menghentikan wadah secara manual, kebijakan mulai ulangnya diabaikan sampai daemon Docker dimulai ulang atau wadah dimulai ulang secara manual. Ini adalah upaya lain untuk mencegah loop restart " (referensi)

Jika Anda menggunakan buruh pelabuhan atau buruh pelabuhan, Anda menghentikan wadah secara manual. Anda dapat melakukan beberapa tes tentang me-restart kebijakan: me-restart daemon buruh pelabuhan, me-reboot server Anda, menggunakan CMD di dalam sebuah wadah dan menjalankan ...

Sebagai contoh jika saya membunuh kontainer saya yang digunakan dengan kebijakan restart, saya melihat bahwa itu keluar dengan kode 137 tetapi tidak restart sesuai dengan buruh pelabuhan ps -a, itu tetap keluar:

[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

Tetapi jika saya me-restart daemon ...

[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

Wadah yang ditetapkan dengan kebijakan mulai ulang, dimulai lagi seperti yang dikatakan dokumentasi, jadi buruh pelabuhan tidak seperti Anda harus menguji kebijakan mulai ulang karena diasumsikan bahwa Anda telah sengaja menghentikan wadah dan Docker ingin memiliki cara untuk mencegah memulai ulang dari awal. loop, jika kamu membunuhnya, kamu benar-benar ingin membunuhnya.

Saya menemukan tautan berikut ini bernilai yang menunjukkan perilaku yang sama di versi yang berbeda (jadi itu bukan bug tetapi perilaku yang diharapkan):

Miguel AC
sumber