Docker 파일 빌드할 때 발생하는 "oci runtime create failed container_linux.go:346: starting container process caused "~~": executable file not found in $PATH": unknown 에러는 문법 오류로 인해 발생 합니다.
starting container process caused 뒤에 문제가 된 문법이 나오게 되는데 해당 부분을 Dockerfile에서 찾아 수정 해주어야 합니다. 일반적으로 RUN 명령에서 exec 형식을 사용할 때 명령 인수에 환경 변수를 지정할 수가 없는데, 환경 변수를 지정 하였거나 문법에 어긋난 명령을 입력할 때 자주 발생 합니다.
FROM centos:7
RUN ["yum -y install nginx"]
위의 예시를 언뜻 보면 문제가 없어 보이지만 일반적인 shell 형식으로 작성된것이 아닌 exec 형식으로 작성 되었습니다. 위의 코드를 정상적으로 동작 시키기 위해서는 아래와 같이 작성 해야 합니다.
FROM centos:7
RUN yum -y install nginx
#또는
RUN ["/bin/bash", "-c", "yum -y install nginx"]
맨 위에 Dockerfile 개념을 설명할 때에 사진에 등장했던 dockerfile 코드 이고 각각의 커맨드들이 step 으로 구분됩니다.
centos7을 사용중이신분들을 기준으로 우선 build 하기 전에 mkdir /build_test 입력하여 디렉토리를 생성해주고 vi /build_test/Dockerfile를 사용하여 위의 코드를 입력 후 저장 해주세요. 이후 cd /build_test/ 로 Dockerfile 이 있는 경로에 접근한 후 아래 사진에 있는 명령어를 입력 합니다. (위의 코드는 간단한 centos+nginx를 설치하기 위한 코드 입니다)
build 했을때 보이는 영어를 자세히 봐보면 이미지 id가 보이는데, 스탭별로 이미지가 생성되는걸 볼 수 있습니다.
docker build -t [생성할 이미지명] .
dockerfile 지정 시 -f옵션 및 예시 : docker build -t [생성할 이미지명] -f [dockerfile 파일명] .
dockerfile을 build 했을 때 아래와 같이 각 스탭별로 이미지가 생성되며 layer 구조를 이루게 됩니다.
여기서 이제 docker container run 명령어를 사용하면 아래 사진과 같이 가장 마지막에 container layer를 생성 합니다. (이 컨테이너 레이어는 컨테이너 삭제하면 같이 삭제 됩니다)
그럼 실제로 컨테이너를 사용할 때는 하나의 파일 시스템으로 보이는데, 이렇게 계층적으로 나눠진 이미지들이 어떻게 하나의 파일 시스템으로 보일까요?
하나로 보이는 이유는 이렇게 모든 레이어들이 준비 되었다면 유니온 파일 시스템(Union File System)을 사용하여 여러개로 나누어져 있는 파일 시스템을 하나의 파일 시스템으로 마운트하여 실제 사용할때는 하나로 보이게 되고, 여러개로 나눠져 있는것을 느낄 수 없습니다.