ExecStop 명령이 포함되어 있으면 서비스(consul)가 정상적으로 시작되지 않습니다.

ExecStop 명령이 포함되어 있으면 서비스(consul)가 정상적으로 시작되지 않습니다.

consul소규모 CoreOS 클러스터를 설정하려고 합니다 . 다음 파일을 에 저장하고 /etc/systemd/system/consul.service서비스를 활성화한 다음 VM을 다시 시작하면 클러스터에 있는 3개의 VM이 모두 정상적으로 부팅되어 함께 연결됩니다.

[Unit]
Description=consul
After=etcd2.service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill consul
ExecStartPre=-/usr/bin/docker rm consul
ExecStart=/usr/bin/docker run -d --name consul --network host consul agent -server -bootstrap-expect=3 -data-dir /tmp/consul -bind BIND_IPADDR --node NODE_NAME -retry-join IPADDR1 -retry-join IPADDR2
# ExecStop=/usr/bin/docker container exec consul consul leave
# ExecStopPost=/usr/bin/docker container stop consul
# ExecStopPost=/usr/bin/docker container rm consul

[Install]
WantedBy=multi-user.target

그러나 명령에서 주석을 제거하면 ExecStopVM이 다시 시작된 후 consul 컨테이너가 실행되지 않기 때문에 시작이 실패합니다. systemctl --failed그러나 서비스 실패는 보고되지 않습니다.

내가 뭘 잘못했나요? 내가 오해했나요 ExecStop? Consul?

답변1

질문(또는 적어도하나문제) -d당신이 에 있다는 것입니다 ExecStart=.

systemd는 서비스가 시작될 때 실행되는 명령이 계속 실행되기를 원합니다. 즉, 포그라운드에서 실행됩니다. 적어도 서비스를 설정할 때 Type=simple이는 기본 유형이며 귀하의 장치에서 작동합니다.

(당신처럼) 즉시 종료되는 명령을 실행하면 docker run -dsystemd는 서비스가 시작되었다고 가정하고 완료될 때까지 잠시 동안 유지합니다. 따라서 컨테이너가 계속 실행되는 동안 systemd 서비스는 컨테이너가 실행되고 있지 않다고 생각합니다. 유사한 명령을 사용하여 이를 확인할 수 있습니다 systemctl status consul.service. (이 명령을 자주 확인하면 systemd가 생각하는 서비스 상태를 이해하는 데 도움이 될 수 있습니다. 여기에 출력을 게시하면 발생하는 추가 문제를 진단하는 데 도움이 됩니다.)

일부 명령이 있을 때 문제를 일으키는 것은 ExecStopPost=systemd가 서비스가 완료되었다고 가정하여 컨테이너를 종료하기 때문에 해당 명령을 실행한다는 것입니다.

-d명령에서 docker run제거하는 것만으로 ExecStart=도 문제를 해결할 수 있습니다.

관련 정보