Dockerfile 문법
https://docs.docker.com/engine/reference/builder/
우선 위 공식 홈페이지의 Dockerfile reference를 참고하여 포스팅하도록 하겠습니다.
Environment replacement
우선 환경변수의 기본 문법에 대해서 살펴보도록 하겠습니다. 여기서 ${FOO}에서 FOO는 컨테이너의 환경변수 입니다. ENV라는 지시어를 사용하면 이미지 빌드타임과, 컨테이너 런타임에 환경변수값을 전달할 수 있게됩니다.
ARG
다음으로는 ARG(인자)에 대해 알아보도록 하겠습니다.
공식문서를 보면 Default values를 한번에 지정해줄 수도, 아니면 그냥 인자만 선언할 수 있습니다. 이는 빌드타임에 docker history에 노출이 됩니다.
만약 선언만 했다면 build타임에 위와같이 값을 삽입해줄 수 있게됩니다.
또한 스코프에대해서도 알아볼 필요가 있는데, 선언전에 인자를 사용하게되면 이는 오류를 내뱉게 됩니다.
또한 동일한 이름으로 ARG, ENV가 정의되어 있다면, 무조건 ENV이 ARG을 덮어쓴다는 점입니다.
실습
일단 node서버의 이미 작성된 Dockerfile을 보도록 하겠습니다.
#으로 주석을 달 수 있으며, Dockerfile은 FROM으로 시작될 수 있는데, 이는 어떤 베이스 이미지를 사용할지를 명시해주는 명령어라고 할 수 있습니다.
그리고 LABEL은 이미지의 메타데이터를 설정해주는 것이라고 보실 수 있습니다. 추후에 컨테이너로 관리하는 이미지가 많아지게되면 조직내의 컨벤션을 가지고 작성하게 되면 좀 더 깔끔하게 관리할 수 있게 됩니다.
그 다음으로는 WORKDIR라는 지시어 입니다. 이는 그 다음의 인자를 Working Directory로 설정해 준다는 점입니다. 간단히 컨테이너에서 cd로 이동하는 것이라고 보시면 됩니다.
그 다음으로는 COPY입니다. 이는 SRC DEST형식으로 인자를 넘겨주게 됩니다. SRC는 Host OS상에서의 경로고, DEST는 이미지 상에서의 경로가 됩니다. 위의 예시에서는 Host OS상의 package*.json에 해당하는 모든 파일을 컨테이너의 ./즉 우리는 WORKDIR를 /app으로 설정했으므로 /app/./에 복사하라 라는 의미입니다.
그 다음으로는 RUN인데, 이는 컨테이너 상에서 명령어를 실행해라 라는 의미입니다. 이는 npm install을 /app/./에서 실행하라는 의미가 됩니다. 이를 통해서 node서버에 필요한 패키지를 다운받게 되는 것입니다.
그 다음은 COPY . . 인데, Host OS의 모든 파일을 /app/./에 복사하라는 의미 입니다. 앞서 package*.json을 빼서 한 이유는 package설치한 이유는 package를 설치하는 작업을 하나의 도커 이미지 레이어로 관리하고 싶었기 떄문입니다. 그리고 COPY . .을 패키지 설치 이후에 실행하고 싶었기 때문에 그 뒤에 지시어를 작성해 주었습니다.
다음으로는 EXPOSE입니다. 이 뒤에는 PORT번호가 오게 되는데, 앞선 포스팅에서도 말했지만 진짜 바인딩하는 것이 아니라 그냥 문서화 하는 기능입니다. 진짜 퍼블리싱하려면 -p옵션을 지정해 주어야 합니다.
마지막으로 CMD지시어인데, 이는 해당 이미지를 가지고 컨테이너를 실행할 때, 어떤 명령어를 실행할지 지정해줍니다. 이는 컨테이너의 주요 프로세스를 지정해 준다고 보시면 적절합니다. CMD로는 배열로 하나의 단어씩 줘도 되지만 "node server.js"이렇게 하나의 문자열로 넘겨줘도 됩니다!
이제 Dockerfile을 통해서 진짜 빌드하고 실행했습니다. 저희가 EXPOSE한 8080번 포트가 명시되어 있는 것을 보실 수 있습니다. 다만 진짜 curl localhost:8080으로 해도 퍼블리싱을 하지 않았으므로 응답이 오진 않습니다.
위와가팅 -p옵션을 주면 정확하게 Hello World!라는 응답이 오는 것을 보실 수 있습니다.
추가 지시어
추가적으로 Dockerfile에서 이전에도 알아봤지만 ENTRYPOINT를 지정해 줄 수도 있습니다. 배열 or 하나의 문자열로 지정해 줄 수 이습니다.
다음과 같이 엔트리 포인트를 지정해 주면 top -b -c이렇게 엔트리 포인트가 앞에 모든 명령어에 붙어서 실행됩니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ Docker && Kubernetes ] - 도커 컨테이너 다루기:도커허브 저장소 이용 (0) | 2022.09.04 |
---|---|
[ Docker && Kubernetes ] - 도커 컨테이너 다루기:이미지 압축파일로 저장 및 불러오기 (0) | 2022.09.03 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 이미지 빌드 (0) | 2022.09.03 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 로그 (0) | 2022.09.03 |
[ Docker && Kubernetes ] - 도커 컨테이너 다루기: 볼륨 (0) | 2022.09.02 |