Docker 설정


다양한 트랙 툴링은 Docker 이미지로 배포돼요.

각 툴링에는 머신을 어떻게 빌드할지 정의하는 Dockerfile이 필요해요. 이 파일은 저장소의 루트 디렉터리에 있어야 하고, 이름은 Dockerfile이어야 해요.

Dockerfile은 툴링이 정확하고 빠르게 동작하는 데 필요한 최소한의 이미지를 만들어야 해요. 모범 사례 페이지에 이 목표를 달성하는 데 도움이 되는 팁이 많이 있어요.

실행

타임아웃

테스트 러너는 솔루션마다 20초 동안 CPU 100%와 3GB 메모리를 사용할 수 있어요. 20초가 지나면 프로세스가 중단되고, 408 오류 코드와 함께 타임아웃으로 보고돼요.

Note

타임아웃 가능성을 줄이려면 성능 모범 사례 문서를 따르는 것을 적극 권장해요.

표준 출력/표준 오류

툴링을 한 번 실행할 때 표준 출력과 표준 오류는 합쳐서 최대 1메가바이트까지 만들어질 수 있어요. 이보다 많이 만들어지면 413 오류 코드와 함께 종료돼요.

각 실행의 stdout과 stderr 내용은 파일에 저장돼요. 출력 디렉터리에 디버깅 정보를 담은 results.out 파일을 작성할 수 있어요.

Caution

현재로서는 메인테이너가 이 파일들의 내용을 볼 수 없어요.

결과

결과 파일은 500킬로바이트를 넘을 수 없어요(스택 트레이스 등을 모두 포함해서요). 파일이 이보다 크면 툴링 실행은 460 오류 코드와 함께 종료돼요.

구성

각 솔루션은 20초 동안 머신 자원을 100% 사용할 수 있어요. 20초가 지나면 프로세스가 중단되고 타임아웃으로 보고돼요.

일부 도구는 기본 구성에서 (약간의) 차이가 필요해요. 그런 경우 Tooling Invoker 저장소의 tools.json 파일에서 구성해요.

네트워크

도구는 인터넷에 접근하지 못한 채 실행돼요. 사용할 수 있는 구성은 두 가지예요:

  1. none. 컨테이너 안의 네트워크 장치를 비활성화해요.
  2. internal. 컨테이너 안에 네트워크 장치를 추가하지만, 그 네트워크는 외부의 어떤 것에도 접근할 수 없어요.

언어마다 구성에 따라 성능이 더 좋아지기도 하고 더 나빠지기도 해요. 예를 들어 Ruby는 none에서 2배 더 빨라지고, Elixir는 internal에서 12x 더 빨라져요.

Docker를 실행할 때 --network 플래그를 써서 로컬에서 실험해 볼 수 있어요. --network none은 기본적으로 지원돼요. 내부 네트워크를 사용하려면 먼저 docker network create --internal internal을 실행해 네트워크를 만들고, 컨테이너를 실행할 때 --network internal을 사용해요.

메모리

언어별로 작업을 실행하는 데 필요한 최대 메모리를 설정할 수 있어요. 이 값을 가능한 한 낮게 잡으면 더 많은 작업을 더 빠르게 병렬로 실행할 수 있어요. 메모리를 악용하려는 사람도 성공할 수 없게 돼요. 언어마다 필요한 최대 메모리 사용량은 크게 달라요. Docker 실행의 최대 메모리 사용량을 벤치마킹해서 확인하는 것을 권장하고, 그렇게 해주시면 감사해요.

메모리는 바이트, 킬로바이트, 메가바이트, 기가바이트를 나타내는 b, k, m, g 접미사를 붙인 숫자로 지정해야 해요.

로컬에서 Docker 실행하기

다음 명령으로 위 설정을 테스트해 볼 수 있어요:

docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/

Dockerfile 수정하기

Dockerfile의 모든 변경은 보안 익스플로잇이 유입되는 것을 막기 위해 @exercism/maintainers-admin 팀의 PR 리뷰를 받아야 해요.