왜 이걸 만드나?

기존 docker run으로 동작하여, 동작을 마친 컨테이너를 삭제하고 새로운 컨테이너를 재생성하여야 하는 문제가 있었다. docker와 채점서버와의 커뮤니케이션도 문제가 되었다. (관련 회의 참고)

이것을 해결하기 위해 코드 실행용 도커에 express를 올리기로 했다.

도커를 express 위에 올리기

/대회id/유저id/문제id로 POST하는 방식으로 코드 실행 api를 만들었다.

api 반환 형식은 아래와 같이 보내주기로 했다.

{
  result: 'SUCCESS'|에러메시지 (string),
  competitionId: n (number),
	userId: m (number),
	problemId: l (number),
}

도커가 채점 서버와 api 주고받는 방식을 이렇게 바꿨다.

처음에 용후님과 이야기할 때에는 아래와 같은 실행흐름을 이야기했다.

채점서버 -> 도커 (코드 실행 요청)
도커 -> 채점서버 (응답)
// 채점 중...
도커 -> 채점서버 (코드 실행 완료 알림 요청)
채점서버 -> 도커 (응답)

하지만 굳이 4번 네트워크를 왔다갔다 할 이유가 있나? 싶어서 최종적으로는 아래와 같이 구현했다.

채점서버 -> 도커 (코드 실행 요청)
// 채점 중...
도커 -> 채점서버 (코드 실행 완료, 응답)