docker-compose에서“다시 시작 : 항상”정책은 어떻게 작동합니까?


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 인데도 docker-compose가 컨테이너를 다시 시작하지 않습니다 . restart: on-failure정책을 사용할 때도 동일한 동작을 관찰합니다 . 도커 작성 버전 2과 버전 3은 동일하게 동작합니다. 내 시스템은 Ubuntu Server 16.04 x64입니다.

내 질문은 :

  1. docker-compose가 충돌 (킬링 된) 컨테이너를 다시 시작하지 않는 이유는 무엇입니까?
  2. 재시작 정책이 작동하는지 확인하는 방법은 무엇입니까?


1
나는 여러 번 거기에 있었지만, 당신이 볼 수 있듯이, 문서는 강력하지 않으며이 기능이 어떻게 작동하는지에 대한 설명이 없습니다. 그래서 질문했습니다.이 분야에서 실무 경험이있는 사람의 답변을보고 싶습니다.
Marcin Zablocki

답변:


20

docker kill을 사용하면 Docker가 컨테이너를 다시 시작하지 않기 때문에 예상되는 동작입니다. "컨테이너를 수동으로 중지하면 Docker 데몬이 다시 시작되거나 컨테이너가 수동으로 다시 시작될 때까지 다시 시작 정책이 무시됩니다. 재시작 루프 " (참조)

docker stop 또는 docker kill을 사용하면 컨테이너를 수동으로 중지하는 것입니다. 재시작 정책에 대한 몇 가지 테스트를 수행 할 수 있습니다 : 도커 데몬 재시작, 서버 재부팅, 컨테이너 내부의 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

다시 시작 정책으로 설정된 컨테이너가 다시 시작됩니다. 설명서가 말한 것처럼 docker kill은 컨테이너를 의도적으로 중지했으며 Docker는 다시 시작을 방지하는 방법을 원하기 때문에 다시 시작 정책을 테스트하는 방법이 아닙니다. 루프, 당신이 그것을 죽이면, 당신은 정말로 그것을 죽이고 싶어.

다른 버전에서 동일한 동작을 보여주는 다음 링크가 유용하다는 것을 알았습니다 (따라서 버그가 아니라 예상되는 동작).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.