Dockerfile
1 Dockerfile
- Dockerfile이란 docker image를 만들기 위한 설정파일이다
- 완성된 이미지를 생성하기위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 쉘 스크립트 등을 하나의 Dockerfile에 기록하면 도커는 이 파일을 읽고 컨테이너에서 작업을 수행하고 이를 이미지로 만들어 낸다
- Dockerfile을 이용하면 직접 컨테이너를 생성하고 필요한 작업을 마친 뒤 이미지로 커밋하는 과정을 자동화할 수 있다
- 이미지 자체를 도커 허브 등을 통해 배포하는 대신 이미지를 생성하는 방법을 기록해 놓은 Dockerfile을 배포할 수 있다
2 Instruction
- 명령어는 소문자로 표기해도 상관은 없지만 일반적으로 대문자로 표기한다.
- Dokcerfile의 명령어는 위에서 아래로 한 줄씩 차례대로 실행된다.
FROM
- 베이스 이미지를 지정한다.
- 이미지 생성시 기반이 되는 이미지 레이어
- 반드시 한번이상 입력해야 한다
- 사용하려는 이미지가 없다면 자동으로 pull한다.
RUN
- 도커 이미지가 생성되기 전에 수행할 쉘 명령어
- 추가적으로 필요한 파일 다운 받기 위한 명령어 명시
- 2가지 형태 가능
RUN ["executable","param1","param2"]
(exec form)
RUN command param1 param2
(shell form)
CMD
- 컨테이너가 시작되었을 때 실행할 실행 파일 또는 쉘 스크립트
- Dockerfile 파일 내에서 1번만 정의가 가능합니다.
- 여러개 정의 할 경우 마지막만 인식
- Overwrite 가능
- 예)
docker run node npm init
npm init으로 CMD를 Overwrite할 수 있다.
- 예)
- 3가지 형태 가능
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
CMD의 올바른 사용법
CMD
의 올바른 사용 방법은 명령어를ENTRYPOINT
로 지정하고 기본 인자를 정의하는 경우에만 CMD를 사용해야 한다.- 그러면 아무런 인자를 지정하지 않고 이미지를 실행할 수 있다.
LABEL
- 이미지에 메타데이터를 추가합니다.
- 메타데이터는 키와 밸류 의 쌍 형태로 저장된다
- 여러개의 메타데이터를 추가할 수 있다
- Docker inspect 명령어로 메타데이터를 확인할 수 있다.
docker images --filter "label=purpose=practice"
- 해당 명령어를 통해 라벨의 키와 밸류가 각각 purpose, practice인 이미지만 필터링할 수 있다.
EXPOSE
- docker container 외부에 노출할 포트를 지정한다.
- 실제로 포트를 개방하는건 아니다.
docker run -p 3000:3000 node
와 같이 -p 옵션으로 포트를 열어줘야한다.
ENV
- 환경변수를 지정한다.
- Dockerfile 과 애플리케이션 코드에서 사용 가능
- 지정한 환경변수는
$변수이름
또는${변수이름}
으로 사용한다. - 다음과 같이 -e 옵션으로 기존 값을 덮어씌울 수 있다.
docker run -e FOO='/something-else' test
예시
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy