7일 동안 Go로 docker 쓰기 (완결편)

8079 단어 docker
오늘이 마지막 날입니다. 마지막으로 용기의 정지, 삭제 기능을 실현하겠습니다.
용기 정지
이전 절에서 우리는 config.json를 통해 용기의 기본 정보를 기록했다. 그 중 하나status 필드는 용기의 상태를 기록하는 데 사용되고, 하나의PID 필드는 용기를 기록하는 init 프로세스가 숙주 호스트에 있는Pid는 용기를 정지한다. 즉, 이pid 프로세스를 죽이고 status 상태를 업데이트하면 된다.
//     ,      
func StopContainer(containerName string) {
	info, err := getContainerInfo(containerName)
	if err != nil {
		logrus.Errorf("get container info, err: %v", err)
		return
	}
	if info.Pid != "" {
		pid, _ := strconv.Atoi(info.Pid)
		//     
		if err := syscall.Kill(pid, syscall.SIGTERM); err != nil {
			logrus.Errorf("stop container, pid: %d, err: %v", pid, err)
			return
		}
		//       
		info.Status = common.Stop
		info.Pid = ""
		bs, _ := json.Marshal(info)
		fileName := path.Join(common.DefaultContainerInfoPath, containerName, common.ContainerInfoFileName)
		err := ioutil.WriteFile(fileName, bs, 0622)
		if err != nil {
			logrus.Errorf("write container config.json, err: %v", err)
		}
	}
}

컨테이너 삭제
우선 우리는 실행 중인 용기, 즉 statusRunning용기를 삭제할 수 없다는 것을 명확히 해야 한다. 따라서 용기를 삭제하기 전에 반드시 용기를 멈추고 이 용기가 생성한 일련의 폴더를 삭제하면 된다.
//     
func RemoveContainer(containerName string) {
	info, err := getContainerInfo(containerName)
	if err != nil {
		logrus.Errorf("get container info, err: %v", err)
		return
	}
	//            
	if info.Status != common.Stop {
		logrus.Errorf("can't remove running container")
		return
	}
	dir := path.Join(common.DefaultContainerInfoPath, containerName)
	err = os.RemoveAll(dir)
	if err != nil {
		logrus.Errorf("remove container dir: %s, err: %v", dir, err)
		return
	}
}

여기까지 저희'7일 동안 고로 docker를 써요'시스템 글이 끝났습니다. 마지막으로 여러분의 관심과 지지에 감사드립니다!기사의 모든 원본 코드가 GitHub에서 시작되었습니다. 여기를 클릭하여 보십시오

좋은 웹페이지 즐겨찾기