https://boostcampwm-8-me.slack.com/archives/C0615MFR0V7/p1701264862558239

22:34 기조님이 클라이언트에 소켓 응답이 안온다고 알려주셨다.

로그를 봤는데, 채점서버에서 파일이 정상적으로 생성되고 있지 않다는 에러가 뜨고 있었다.

코드실행용 도커서버에서 코드를 실행한 뒤 그 결과 파일들을 /algo-with-me/submission/ 이하에 생성해줘야 하는데, 그렇게 하지 못했던 것이다.

설명

https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf

우선 이 글을 읽는 것이 많은 도움이 될 것이다.

지금까지는 docker를 이용해 배포할 때 아래와 같이 명령어를 사용했다.

sudo docker run ...

sudo docker compose up ...

모두 sudo를 이용해 root 권한으로 실행했고, Dockerfile이나 docker run 명령 안에서 user를 특정해주지 않았다.

이런 경우, 도커는 root 권한으로 돌아가게 된다.

도커 컨테이너 안쪽의 유저는 사실 호스트 OS의 유저가 단순 매핑된 결과이며, 도커 컨테이너 안에서 가상의 유저가 새로 생긴다던지 하는 일은 발생하지 않는다.

따라서 컨테이너 안의 유저도 호스트 OS의 root가 가지는 권한을 그대로 갖게 된다.

Host 컴퓨터, 채점서버, 도커서버는 bind mount를 이용한 공유 스토리지 problems, submissions, testcases를 갖고 있다.

채점서버에서는 사용자가 제출한 코드에 프레임 코드를 씌워 실행 가능한 형태로 바꾼 뒤 submission 이하에 파일을 쓰게 되는데, 이때 채점서버 컨테이너 안의 유저가 root였기 때문에 새로운 파일을 쓰면 root의 파일로 쓰이게 된다.