Làm thế nào để khởi động lại: Chính sách luôn luôn hoạt động trong docker-compose?


23

Tôi có tập tin soạn thảo docker với PostgreSQL và ứng dụng của tôi, như thế này:

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"

Vấn đề là restart: alwayschính sách đó dường như không hoạt động khi tôi giết container (mô phỏng sự cố ứng dụng bằng cách sử dụng docker kill) và docker-compose không khởi động lại container của tôi, mặc dù Mã thoát là 137 . Tôi quan sát hành vi tương tự khi tôi sử dụng restart: on-failurechính sách. Các phiên bản 23của docker-compose hoạt động giống nhau. Hệ thống của tôi là Ubuntu Server 16.04 x64.

Câu hỏi của tôi là:

  1. Tại sao docker-compose không khởi động lại container bị hỏng (bị giết)?
  2. Làm thế nào để kiểm tra nếu chính sách khởi động lại hoạt động?


1
Tôi đã ở đó nhiều lần, nhưng như bạn có thể thấy, tài liệu này không mạnh mẽ và không có lời giải thích về tính năng này hoạt động như thế nào, đó là lý do tại sao tôi đặt câu hỏi - tôi muốn xem câu trả lời từ một người có kinh nghiệm thực hành trong lĩnh vực này.
Marcin Zablocki

Câu trả lời:


20

Khi bạn sử dụng docker kill, đây là hành vi được mong đợi vì Docker không khởi động lại container: "Nếu bạn dừng thủ công một container, chính sách khởi động lại của nó bị bỏ qua cho đến khi Docker daemon khởi động lại hoặc container được khởi động lại theo cách thủ công. Đây là một nỗ lực khác để ngăn chặn một vòng lặp khởi động lại " (tham khảo)

Nếu bạn sử dụng dừng docker hoặc hủy docker, bạn sẽ tự dừng container. Bạn có thể thực hiện một số thử nghiệm về chính sách khởi động lại: khởi động lại trình nền của docker, khởi động lại máy chủ của bạn, sử dụng CMD bên trong một container và chạy thoát ...

Ví dụ: nếu tôi giết container của mình được triển khai bằng chính sách khởi động lại, tôi thấy rằng nó đã thoát với mã 137 nhưng nó không được khởi động lại theo docker ps -a, nó vẫn bị thoát:

[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

Nhưng nếu tôi khởi động lại 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

Container được thiết lập với chính sách khởi động lại, bắt đầu lại, đó là tài liệu nói, vì vậy, docker kill không phải là cách bạn nên kiểm tra chính sách khởi động lại vì cho rằng bạn đã cố tình dừng container và Docker muốn có cách ngăn chặn khởi động lại Vòng lặp, nếu bạn giết nó, bạn thực sự muốn giết nó.

Tôi thấy các liên kết sau có giá trị thể hiện cùng một hành vi trong các phiên bản khác nhau (vì vậy đó không phải là lỗi mà là hành vi dự kiến):

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.