2017-01-05 2 views
0

Docker 컨테이너를 서비스로 실행하려고합니다. 여러 대의 서버에서 클러스터 된 서비스이며 연결하는 데 몇 초가 걸릴 수 있습니다. 컨테이너는 실제로 컨테이너를 종료하지 않고 장애 루프에서 멈추는 경우가 있습니다. 그래서 systemd는 시작을 성공적으로보고합니다. 내가 systemctl start myservice를 실행하면이 (겉으로 때문에 docker pull의) 시작하는 데 몇 초 정도 걸립니다,시스템 서비스 시작을위한 로그 파일 모니터링

TimeoutStartSec=60 
Restart=always 
RestartSec=10 
ExecStartPre=-/usr/bin/docker stop %n 
ExecStartPre=-/usr/bin/docker rm %n 
ExecStartPre=/usr/bin/docker pull my_container 
ExecStart=/usr/bin/docker run --name %n my_container 
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | grep -m 1 \"All services up and running.\" ]; do sleep 1; done 

하지만, 상대적으로 빠르게 성공을 반환 : 내 유닛 파일에 이런 것들과 프로세스를 모니터링하기 위해 노력하고있어.

그러나 수동으로 docker logs -f myservice.service을 실행하면 서비스에 "모든 서비스가 실행 중입니다."라는 메시지가 몇 초 동안 기록되지 않습니다.

나는 https://github.com/ibuildthecloud/systemd-docker을 보았습니다. 그러나 1 년 넘게 업데이트되지 않은 Repo에 대해서는 조심 스럽습니다. (대런은 Rancher와 함께 바쁜 것 같습니다.)

내 질문 : 내 ExecStartPost가 작동하지 않는 이유는 무엇입니까? systemd를 사용하여 컨테이너를 서비스로 직접 시작할 수있는 더 좋은 방법이 있습니까?

+0

정말 시스템이 필요합니까? Docker 데몬은 프로세스를 계속 실행합니다. "run"명령에는 다시 시작 정책 옵션이 있습니다. https://docs.docker.com/engine/reference/run/#/restart-policies---restart –

+0

필요합니다. 프로덕션 환경에서 여러 상호 의존적 인 서비스를 실행하기 때문에 깨끗하게 관리해야합니다. 나는'docker run'을 어떻게 직접 사용할 지 확신하지 못합니다. rc.local? 조작? – aayore

+0

Docker 데몬은 프로세스 관리자입니다. "-d"및 "--restart = always"옵션을 사용하여 컨테이너를 실행하면 백그라운드에서 실행되고 실패하면 자동으로 다시 시작됩니다. –

답변

0

나는 이것이 작동하는 방법을 알아 냈고 해결책은 약간의 얼굴 표정이다. 내가하려고했던 일은 괜찮 았어, 나는 단지 grep과 sleep에 대한 완전한 경로가 필요했다.

TimeoutStartSec=60 
Restart=always 
RestartSec=10 
ExecStartPre=-/usr/bin/docker stop %n 
ExecStartPre=-/usr/bin/docker rm %n 
ExecStartPre=/usr/bin/docker pull my_container 
ExecStart=/usr/bin/docker run --name %n my_container 
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | /bin/grep -m 1 \"String that indicates my service is up successfully\" ]; do /bin/sleep 1; done 

나는 그것을 약간 테스트 해 보았는데, 꽤 잘 작동하는 것 같습니다.