현재 AWS에 CoreOS 클러스터가 있습니다. 클러스터는 주로 Rails 애플리케이션을 위해 여러 컨테이너를 실행합니다. 그러나 컨테이너 중 하나는 특정 외부 API의 대량 데이터를 처리하는 순수 Ruby 애플리케이션입니다.
실제로 애플리케이션의 Docker 컨테이너는 매일 오전 4시(UTC)에 실행됩니다.
myapp.service:
[Unit]
Description=MyApp service
Requires=docker.service
[Service]
ExecStart=/home/core/sc/myapp_start.sh
User=core
myapp.timer:
[Unit]
Description=MyApp Timer
Requires=docker.service
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
서비스에 의해 실행되는 셸 스크립트는 다음과 같이 요약될 수 있습니다.
/usr/bin/docker run --rm --name=myapp omg/myapp:$tag
컨테이너는 CircleCI를 통해 클러스터에 배포되므로 컨테이너는 클러스터에 있는 서버 중 하나에 위치할 수 있습니다. 그러나 같은 서버에서 실행되는 다른 컨테이너로 인해 RAM을 많이 차지하거나 디스크에 여유 공간이 없는 등으로 인해 해당 컨테이너를 실행하는 서버의 메모리가 부족해지면 해당 컨테이너가 중지되었다가 다시 실행됩니다. 클러스터의 다른 서버에 있습니다.
이는 하루에 한 번만 실행해야 하고 서버에 장애가 발생하면 다시 실행해서는 안 되는 Ruby 애플리케이션의 맥락에서 문제가 됩니다.
이 경우 어떻게 해야 합니까?
감사해요.
답변1
컨테이너 재시작/이동 후에도 유지되는 방법(영구/공유 파일 시스템의 파일, 데이터베이스의 일부 정보, 외부 조정 서비스/애플리케이션 등)을 사용하여 자체 실행을 추적하도록 애플리케이션을 가르쳐야 합니다. 상황에 맞는 것은 무엇이든 가능합니다. ).
다시 시작한 후 애플리케이션이 지정된 간격 내에 실행된 것을 발견하면 어떤 작업도 수행하지 않고 종료됩니다. 그것가능한원하는 경우 이전에 완료하지 않은 작업을 선택하고 완료하도록 가르칠 수도 있습니다. :)
애플리케이션 내에서 이 작업을 수행할 수 없는 경우 애플리케이션을 사용자 정의 래퍼로 래핑하고 래퍼 내에서 수행할 수 있습니다.