발단
평소처럼 개발 후 Github에 올리고, Github Actions를 통해 EC2 서버로 CD 진행 중에
err: docker: failed to register layer: Error processing tar file(exit status 1): write /usr/local/openjdk-11/lib/server/classes.jsa: no space left on device.\
오류가 발생했다.
CD 때문에 꺼진 서버는 프로덕션 서버였기에, 1분이라도 빨리 해결해야 했다.
(참고로, 필자는 EC2 프리티어 서버를 사용하고 있다.)
아래에 시도했던 해결 과정, 그리고 마침내 해결한 방법을 적었다.
해결 시도 1 : 메모리 부족인가
프로덕션 서버 CD 중 갑자기 나타난 no space 오류에, 순간 메모리와 디스크를 혼동했다.
공간이 없다고 하니, 예전에 겪었던 EC2 메모리 부족 문제가 머릿속을 스쳐가며 Swap 설정을 다시 건드려봤다.
어떤 호환성 문제로 Swap 설정 파일을 주석 처리 했었는데, 주석을 지우고 다시 스왑을 적용했다.
역시나 문제는 그대로였다. 그때 내가 해결해야 할 문제는 RAM 메모리 용량이 아닌 디스크 용량이었다는 걸 깨달았다.
해결 시도 2 : 안 쓰는 도커 이미지 삭제
굉장히 많은 해결 방법이 '용량 부족 문제 해결을 위해 안 쓰는 도커 이미지를 삭제하고, 로깅 등 용량 높은 다른 파일을 삭제하라'였다. 나는 이미 안 쓰는 것들을 제거한 상태였기에, 위와 관련해서는 더욱 손을 쓸 수 있는 방법이 없었다.
드디어 해결
다른 해결법을 뒤져보고 적용해 봐도 해결이 되지 않았다. 결국엔 EC2 프리티어 디스크 용량이 8GiB라서 도커 시스템에서도 저장 공간이 없어서 오류가 발생했다고 가설을 설정했다. (EC2 서버를 할당받은 지 오래되어서 내가 용량을 얼마나 할당했는지 기억이 안 났는데, 그 당시 8GiB 용량을 선택했던 내가 원망스러웠다.)
그 가설에 맞춰서 EC2에 연결된 EBS(Elastic Block Storage) 용량을 늘려보자 생각했고, 삽질해본 결과 인프런 질문에서 황금같은 정보를 얻었다. (EBS 프리티어 용량이 최대 30기가라는 것.) EBS 프리티어 최대 용량인 30GiB로 늘렸다. (AWS 웹에서 용량 증설 후 EC2에서 따로 설정해줘야 하는 것들이 있었다. 그 절차는 이 글을 참고해 주길 바란다.)
그렇게 설정하고, 다시 CD를 돌려 docker run을 실행해 보니 정상 작동했다. (언제나 행복한 초록 체크 표시)
다들 화이팅!