🛠️TOOL/🐳Docker
[docker] - dockerfile 문법과 작성법 : CMD vs ENTRYPOINT
KangManJoo
2024. 5. 31. 15:54
도커파일은 도커로 이미지를 생성하기 위한 용도로 작성하는 스크립트 파일이다.
도커 이미지를 빌드할 때는 전적으로 도커 파일에 의존해 빌드를 실시한다.
도커 스크립트는 크게 어렵지 않지만 헷갈리는 것들이 있어 한 번 정리해두면 좋다.
예시로 알아보는 명령어들
도커파일 예시와 함께 각 명령어 사용법을 알아보자.
# 베이스 이미지로부터 시작
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 환경 변수 설정
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
# 라벨 설정
LABEL maintainer="example@example.com"
LABEL version="1.0"
LABEL description="This is a sample Dockerfile."
# 로컬 파일을 이미지로 복사
COPY . /app
# 필요한 의존성 설치
RUN pip install --no-cache-dir -r /app/requirements.txt
# 포트 80을 외부에 노출
EXPOSE 80
# 볼륨 마운트 지정
VOLUME /app/data
# 컨테이너가 시작될 때 실행할 명령어
ENTRYPOINT ["flask", "run"]
CMD ["test"]
- From
- 도커파일에서 베이스 이미지를 지정하는 지시어다.
- 이미지와 태그를 지정하면 registry에서 해당 이미지를 자동으로 pull 한다.
- Workdir
- 작업 디렉토리를 설정한다.
- 컨테이너의 해당 디렉토리에서 작업을 실시한다.
- Env
- 환경변수를 설정하는 지시어다.
- key-value 형식으로 환경변수명과 값을 저장한다.
- Label
- 라벨은 환경변수가 아닌 메타데이터를 이미지에 추가한다.
- 이미지 내에 있는 메타데이터를 추후 명령어를 통해 확인해 이미지에 대한 상세 정보를 얻을 수 있다.
- COPY
- Host 내에 있는 파일 또는 디렉토리를 컨테이너로 복사한다.
--chown
옵션으로 소유 권한도 지정할 수 있다.
- Run
- 커맨드를 실행하여 새 이미지에 포함시키는 역할을 한다.
- 주로 컨테이너에 필요한 소프트웨어나 라이브러리를 설치할 때 사용한다.
- 특정 위치에 파일이나 디렉토리를 생성하기 위해서도 사용한다.
- Expose
- 컨테이너가 실행될 때 컨테이너로 들어오는 트래픽을 특정 포트로 받아들일 수 있도록 지정해준다.
- 그러나 expose를 명시해도 외부에 공개되는 것이 아니고,
docker run -p <host port>:<ct port>
옵션으로 포트를 명시해주어야 호스트 운영체제로 오픈된다. - 혹은 expose로 명시 후 -P 옵션을 주면 호스트의 랜덤 포트가 컨테이너의 포트에 매핑된다.
- Volume
- Volume은 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트 시켜주는 지시자이다.
- 컨테이너 내의 디렉토리만 지정해주면, host의 어떤 폴더에 마운트되는지는 알 수 없다.
- 마운트 지점은
docker volume inspect
명령어로 확인 가능하다.
- Entrypoint
- 컨테이너 실행 시 입력 될 command를 지정한다.
- 컨테이너 실행 시 param 값을 대체할 수 없다.
- Cmd
- 컨테이너 실행 시 입력 될 command를 지정한다.
- 한 도커 파일 내에 여러번 나올 경우 맨 마지막 줄의 CMD만 유효하다.
- 컨테이너 실행 시 값을 대체할 수 있어 default 값으로 주로 사용한다.
자세한 예시
RUN
# shell form
RUN /bin/bash -c 'echo hello'
# exec form
RUN ["/bin/bash", "-c", "echo hello"]
Run을 사용할 때는 위와 같이 shell form, exec form 두 가지 형태로 사용 가능하다.
ENTRYPOINT vs CMD
앞서 말한 것처럼 Entrypoint는 대체 불가이고 Cmd는 대체 가능하다.
FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
위 도커파일을 그대로 실행하면, Hello world가 출력된다.
그러나 param값을 다음과 같이 지정해서 실행하면, CMD값이 대체된다.
reference