Mac에서 Docker 사용시 include 문제

약 6~7년 전에 회사의 프로젝트가 Linux 빌드만 지원하다가, Docker를 사용하면서 Cross Platform Build를 지원하자 해서 Docker를 쓰게 되었었다. 그런데 회사 내에서는 대부분 다 Linux를 쓰기 때문에 보이지 않는 단점들이, MacOS Docker나 Windows Docker를 쓰다보면 나타난다. 일단 MacOS에서 나타나는 문제중에 가장 큰것은, Case-Insensitive 한 FileSystem에서 나오는 문제이다.

많은 사람들이 잘 모르고 지나가는 부분인데, MacOS는 원래 MacOS 확장 (저널링) 이라는 FS가 기본이었다. 해당 FS는 Case-sensitive한 FS이기 때문에 대소문자를 구별한다. 이 경우에는 Docker 사용시에 파일명의 대소문자 때문에 문제가 발생하지 않고, 리눅스와 동일하게 동작한다.

그런데 애플은 몇 년 전부터 APFS를 기본으로 사용하고 있고 대소문자 구별을 하지 않는다. APFS도 대소문자 구별을 할 수 있지만 그러려면 하드를 포맷해야 한다.

만약에 인클루드 순서가 다음과 같다고 하면

1. include/media/Debug.h
2. include/network/debug.h

이렇게 되어 있을 때, Docker 안에서

#include <debug.h>
라는 코드를 실행하면, Linux에서는 2번이 인클루드 되지만, Mac의 기본 APFS에서는 1번이 인클루드가 된다. 동일한 Docker 환경인데도 말이다. 이것은 Docker가 OS를 아예 가상화 하는 것이 아니라, Filesystem의 기본은 OS의 것을 그대로 사용하기 때문에 발생하는 문제이다.

따라서 Linux와 Mac에서 같은 Docker 환경을 제공하려면, 인클루드 패스를 나누거나, 대소문자만 다른 같은 파일명을 사용해서는 안된다.

그 다음은 Mac과 Windows에서 동일하게 나타나는 현상인데, 빌드속도가 어마무시하게 늘어난다. Linux에서 Docker를 사용할 때는 Virtual Machine상에서 돌아가는것이 아니기 때문에 가상화 비용이 들어가지 않기 때문에 속도저하가 별로 없지만, Mac과 Windows에서 Docker를 사용할 때는 Linux Virtual Machine이 돌아가고 그 위에서 Docker가 돌아가기 때문에 속도가 상당히 느려진다.

Docker는 그래서 그냥 Linux에서 사용하는게 제일 좋은거 같긴 하다.