EOL(End Of Line), LF(Line Feed), CRLF(Carriage-Return Line Feed)

최근에 도커(Docker)를 공부하면서 Dockerfile을 통해 이미지 빌드 연습을 하고 있는데, 빌드에 성공한 sinatra 이미지를 데몬 컨테이너 런칭했더니 하라는 런칭은 안하고 컨테이너가 즉사해버리는 사태가 발생했다.

무엇이 문제인지 빌드된 이미지를 데몬 컨테이너로 실행하지 않고 bash 쉘로 실행시킨 후 직접 sinatra 스크립트를 실행시켜보았다. 그랬더니 등장하는 메시지, “/usr/bin/ruby^M: bad interpreter: No such file or directory”…

저 메시지를 구글에 검색했다가 중요한 사실을 알게 되었다. 사실, 문제는 나에게 있었다는 것을…

문제의 스크립트를 나는 윈도우의 notepad++를 통해 작성하였다. 그리고 도커 이미지는 우분투를 베이스 이미지로 삼은 이미지였다. 즉, “윈도우에서 작성한 스크립트를 리눅스에서 실행”시켰다.

여기서 한 가지 밝히자면 나는 운영체제에 대해 그리 깊게 알지 못한다. 개발자로 일하기 전에는 리눅스를 한 번도 사용한 적이 없었을 정도다. 골수 윈도우 유저인 내게 리눅스, 더 나아가서 유닉스는 미지의 세계다. 그나마 최근에 리눅스를 조금씩 공부하면서 약간은 익숙해졌다고 생각했는데, 설마 이런 문제가 내 앞을 가로막을 줄은 몰랐다.

결론을 말하자면, 윈도우와 리눅스 EOL(End Of Line)은 다르다. 윈도우는 CRLF(Carriage-Return Line Feed), 리눅스(유닉스 포함)는 LF(Line Feed) 방식인데, 나는 그런 것을 전혀 고려하지 않고 윈도우에서 작성한 스크립트를 리눅스에서 그대로 실행해버렸으니 호환되지 않는 EOL으로 인해 문제가 발생한 것이다…

그래서 나는 notepad++에 있는 EOL Conversion 기능을 통해 해당 스크립트의 EOL을 LF 방식으로 바꿔주었고, 그제서야 sinatra 데몬 컨테이너는 정상적으로 실행되었다는 허탈한 이야기…