systemd는 서비스 A가 B를 시작하도록 허용합니다.

systemd는 서비스 A가 B를 시작하도록 허용합니다.

Snap을 사용하여 Docker를 설치했습니다. snap이 docker를 업데이트할 때마다 snap.docker.dockerd(기본값) 서비스가 중지되었다가 일정 시간 후에 시작됩니다. docker-compose 애플리케이션이 실행 중이므로 애플리케이션을 업데이트할 때마다 충돌이 발생합니다.

오류로 인해 Docker Compose를 다시 시작하는 옵션이 작동하지 않습니다(https://github.com/docker/for-win/issues/584)

그래서 내가 볼 수 있는 유일한 옵션은 systemd 서비스를 사용하는 것입니다. 이것은 (/etc/systemd/system/docker-compose-chebur.service)입니다:

[Unit]
Description=Docker Compose Chebur
Requires=snap.docker.dockerd.service
PartOf=snap.docker.dockerd.service
After=snap.docker.dockerd.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/maybephilipp/projects/chebur-docker
User=maybephilipp
Group=docker
ExecStartPre=/usr/bin/sleep 3
ExecStart=/snap/bin/docker compose -f chebur.docker-compose.yml up -d
ExecStop=/snap/bin/docker compose -f chebur.docker-compose.yml down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

운영 체제: 우분투 20.04.4

BindsTo=, PartOf=, Requires=를 시도했지만 인터넷에서 읽은 것처럼 snap.docker.dockerd가 중지된 상태에서 시작될 때 실제로 서비스를 시작하는 데 도움이 되지 않습니다.

그래서 제 질문은: 스냅이 종료될 때 서비스를 시작하고 도커 서비스를 시작하려면 어떻게 해야 합니까?

docker compose up -d두 번째 생각은 5분 이하마다 실행되는 크론 탭을 만드는 것이었습니다 . 그런데 더러워 보이네요 :(

답변1

섹션을 다음으로 변경하고 싶습니다 [Install].

[Install]
WantedBy=multi-user.target
WantedBy=snap.docker.dockerd.service

그런 다음 다시 실행하십시오 systemctl enable docker-compose-chebur.service.


당신은 게임을 하고 Requires=있고 BindsTo=거의 올바른 생각을 가지고 있지만 잘못된 방향으로 가고 있습니다. 계속 " docker-compose-chebur.service시작하면 나도 시작하겠다 snap.docker.dockerd.service"고 하더군요. 그러나 " snap.docker.dockerd.service시작할 때 시작됩니다 " 라는 반대가 필요합니다 . 따라서 , 를 docker-compose-chebur.service추가해야 합니다 . 이 서비스만 수정할 수 있는 경우 , 의 반대 는 , 섹션에서만 설정할 수 있습니다 . or 섹션 에 설정하는 것이 일반적이므로 일반적으로 잘못되었지만 필요한 경우 직접 삽입하여 수행할 수 있습니다.Wants=Requires=BindsTo=snap.docker.dockerd.serviceWants=Requires=WantedBy=RequiredBy=[Install]BoundBy=[Unit][Install]


이는 정의한 모든 관계에 대한 설명입니다. 어쩌면 모두 필요하지 않을 수도 있습니다.

  • Requires=A.service: 이것이 시작되면, A.service또한 시작됩니다. After=설정되어 있고 시작할 A.service수 없으면 시작되지 않습니다.
  • PartOf=A.service: A.service정지/재기동 시에도 정지/재기동됩니다.
  • After=A.service: 바라보다Requires=
  • WantedBy=A.service: A.service시작되면 이것도 시작하세요. RequiredBy=which 와 달리 Requires=성공 확인을 건너뜁니다.

snap.docker.dockerd.service귀하의 경우에는 이미 있는지 확인하겠습니다 WantedBy=multi-user.target. 그렇다면 그 줄을 넣고 [Install]간단히 갖겠습니다 WantedBy=snap.docker.dockerd.service.

인용하다: https://www.freedesktop.org/software/systemd/man/systemd.unit.html

관련 정보