Docker의 컨테이너 실행 옵션 중 --restart
와 --rm
은 함께 사용될 수 없다. 각 옵션의 기능과 해당 문제의 이유에 대해 알아보자.
--restart
: 컨테이너가 종료될 때 자동으로 재시작되도록 설정
--restart
옵션은 보통 서비스의 지속성을 보장하기 위해 사용되며 no
, on-failure
, unless-stopped
, always
등의 값을 가질 수 있다. 각각 다른 시나리오에 따라 컨테이너의 재시작 여부가 결정된다.
no
: 컨테이너가 자동적으로 재시작되지 않는다. --restart
옵션을 사용하지 않을 경우 기본값이다.on-failure[:max-retries]
: 컨테이너가 비정상적인 종료 상태(오류 상태)로 종료될 때만 재시작된다. 선택적으로 최대 재시도 횟수를 지정할 수 있다.unless-stopped
: 사용자가 docker stop
명령어로 직접 컨테이너를 종료시키지 않는 한, 컨테이너는 재시작된다. always
: 컨테이너가 어떤 방식으로 종료되든 간에 항상 재시작된다.docker stop
명령어로 컨테이너를 직접 종료시킬 경우에도 시스템 재부팅 등으로 인한 Docker Daemon 재시작시 컨테이너를 재시작한다.컨테이너가 실행 중인 상태에서 Docker Daemon을 재시작할 경우, no
를 제외한 옵션을 가진 컨테이너는 재시작된다 (on-failure
의 경우도 Docker Daemon 재시작 과정에서의 종료를 비정상적인 종료로 인식하여 재시작하는 듯하다).
Docker Daemon이 구동 중인 상태에서 컨테이너가 정상적으로 종료할 경우, unless-stopped
, always
옵션을 가진 컨테이너는 재시작된다. hello-world 이미지로 컨테이너를 실행할 때 해당 옵션을 지정하면 컨테이너는 명시적으로 stop할 때까지 반복 실행된다.
docker stop
명령어로 Exited 상태가 된 컨테이너는 Docker Daemon이 재시작될 때 always
옵션을 가진 경우가 아니라면 재시작하지 않는다.
** Docker 컨테이너의 상태에 대해 정리한 링크
--rm
: 컨테이너가 정상적으로 종료된 후에 컨테이너를 자동으로 제거
--rm
옵션은 임시 컨테이너나 테스트 목적의 컨테이너에 사용되며 컨테이너가 종료되면 자동으로 삭제되므로 재시작할 필요가 없다.
이 두 옵션을 같이 사용하려고 할 때 문제가 발생한다. --restart
옵션이 설정된 컨테이너는 종료 후 자동으로 재시작해야 하지만, --rm
옵션은 컨테이너가 종료되면 즉시 삭제해야 한다. 이 두 동작은 서로 상충되기 때문에 Docker는 이 두 옵션을 동시에 사용하는 것을 허용하지 않는다.