Docker를 통한 시스템 감시 및 알림

Docker를 통한 시스템 감시 및 알림

그래서 저는 Linux에서 간단한 서비스를 실행하기 위해 이 Docker 설정을 구성해 왔습니다. 서비스는 systemd watchdog 및 sdnotify python 라이브러리를 사용하여 서비스가 정지되지 않도록 합니다. 내 문제는 알림이 docker VM에서 systemd로 전송되지 않는 것 같고 감시가 항상 시간 초과된다는 것입니다. 이것은 내 서비스입니다.

[Unit]
Description=My Service
After=docker.service
Requires=docker.service
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
WatchdogSec=190
TimeoutStartSec=0
NotifyAccess=all
User=root
WorkingDirectory=/root
ExecStartPre=-/usr/bin/docker stop my-container
ExecStartPre=-/usr/bin/docker rm my-container
ExecStartPre=-/bin/bash docker_build.sh
ExecStart=/bin/bash docker_start.sh

[Install]
WantedBy=multi-user.target

다음 명령을 사용하여 컨테이너를 시작합니다.

docker run -t --name my-container --privileged my-service

내 dockerfile은 다음과 같습니다.

FROM python:3.6.9

# Open MQTT and HTTPS ports
EXPOSE 443 8883

COPY requirements.txt requirements.txt
RUN python -m pip install -U -r requirements.txt

CMD python -u -m service_module

산출:

May 05 13:31:55 DIET bash[11155]: [SO][Build Date]: 0.1-V-20200122h13:09
May 05 13:31:55 DIET bash[11155]: [SYS][INFO][17:31:55]: Serial port opened on: /dev/ttyS1
May 05 13:31:56 DIET bash[11155]: [GOOGLE][INFO][17:31:56]: Sent message: {'ip': ['x'], 'versions': {}, 'temperature': 37.793, 'cpu': 15.1, 'memory': 47.7, 'net': {'out': 7.95, 'in': 95.587}}
May 05 13:33:37 DIET systemd[1]: my.service: Watchdog timeout (limit 3min 10s)!
May 05 13:33:37 DIET systemd[1]: my.service: Killing process 11155 (bash) with signal SIGABRT.
May 05 13:33:37 DIET systemd[1]: my.service: Killing process 11157 (docker) with signal SIGABRT.
May 05 13:33:37 DIET systemd[1]: my.service: Main process exited, code=killed, status=6/ABRT
May 05 13:34:53 DIET bash[11155]: [GOOGLE][INFO][17:34:53]: Sent message: {'ip': ['x'], 'versions': {}, 'temperature': 33.916, 'cpu': 0.9, 'memory': 47.8, 'net': {'out': 9.882, 'in': 6.336}}

"[GOOGLE][INFO]" 줄이 표시되면 알림을 보냅니다. 첫 번째와 시간 초과 사이에는 약 2분 정도의 시간이 있으므로 재설정되지 않습니다. 미리 감사드립니다!

편집하다:docker 외부에서 이 서비스를 실행하면 정상적으로 작동합니다.

답변1

나는 그것을 사용하여 고쳤다.sdnotifyagent. 이에 대한 시작 명령을 변경했습니다.

/usr/local/bin/sdnotify-proxy /run/my-sd.sock \
    /usr/bin/docker run -t --name my-container --volume /run/my-sd.sock:/run/my-sd.sock \
    --env NOTIFY_SOCKET=/run/my-sd.sock --privileged my

관련 정보