Docker 20.10.x는 시스템을 종료하거나 다시 시작하기 전에 몇 분 동안 기다리게 합니다.

Docker 20.10.x는 시스템을 종료하거나 다시 시작하기 전에 몇 분 동안 기다리게 합니다.

Debian Buster를 최신 버전(Bullseye)으로 성공적으로 업그레이드한 후 다시 시작하거나 종료하려고 할 때마다 다음 메시지와 함께 일부 프로세스가 완료되기를 기다리는 동안 완료하는 데 몇 분이 걸립니다.

watchdog: watchdog0: watchdog did not stop!
systemd-shutdown[1]: Syncing filesystem and block devices.
systemd-shutdown[1]: Sending SIGTERM to remaining process...
systemd-journald[372]: Received SIGTERM from PID 1 (systemd-shutdown).
systemd-shutdown[1]: waiting for process: containerd-shim.

내 시스템에 Docker가 설치되어 있는데 이것이 문제의 원인인 것 같습니다.

$ ps aux | grep containerd-shim
root        3420  0.0  0.1 1451744 21876 ?       Sl   11:07   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 0dd6b89a62d...66cc5c0a44b6f01d77c -address /run/containerd/containerd.sock

$ dpkg -S /usr/bin/containerd-shim-runc-v2 
containerd: /usr/bin/containerd-shim-runc-v2

$ aptitude why containerd
i   docker.io Depends containerd

시스템을 다시 시작하기 전에 도커의 서비스/소켓을 중지해 보았습니다. 변경 없음.

이 문제를 해결하는 방법을 아시나요?


$ docker version
Client:
 Version:           20.10.5+dfsg1
 API version:       1.41
 Go version:        go1.15.9
 Git commit:        55c4c88
 Built:             Wed Aug  4 19:55:57 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.5+dfsg1
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.15.9
  Git commit:       363e9a8
  Built:            Wed Aug  4 19:55:57 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.5~ds1
  GitCommit:        1.4.5~ds1-2
 runc:
  Version:          1.0.0~rc93+ds1
  GitCommit:        1.0.0~rc93+ds1-5+b2
 docker-init:
  Version:          0.19.0
  GitCommit:        

답변1

이는 실시간 복구를 사용하는 경우 Containerd shim v2의 알려진 문제입니다. Containerd ≥ 1.6.0-rc.2에서 수정되었습니다. Containerd 1.5.10으로 백포트되었습니다. Docker 엔진 20.10.13에서 수정되었습니다.

해결책:

  1. v2 대신 shim v1 사용

    특정 컨테이너의 런타임 지정

    docker run --runtime=io.containerd.runtime.v1.linux ...`
    

    또는 시스템 전체의 기본 런타임을 설정하세요.

    # cat /etc/docker/daemon.json
    {
        "default-runtime": "io.containerd.runtime.v1.linux",
        "live-restore": true
    }
    

    경고하다:shim v1은 더 이상 사용되지 않으며 다음 Docker 버전에서 제거될 예정입니다. 경고하다:shim v1은 cgroups v2에서 작동하지 않습니다.

  2. 재시작/종료 전에 systemd 서비스를 사용하여 컨테이너 종료

    # /etc/systemd/system/containerd-shim-v2-workaround.service
    [Unit]
    Description=containerd-shim v2 workaround
    Before=docker.service
    Requires=containerd.service
    After=containerd.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStop=-/bin/sh -c '[ "$(systemctl is-system-running)" = "stopping" ] || exit 0; ctr -n moby tasks ls -q | xargs -r -L1 ctr -n moby tasks kill; ctr -n moby containers ls -q | xargs -r ctr -n moby containers rm'
    
    [Install]
    WantedBy=containerd.service
    

    나는 이것을 moby 질문 스레드 아래에 게시했습니다. 그러나 이는 모든 사용 사례에 적합하지 않을 수 있습니다. 주의해서 사용하세요.

관련 정보