클라우드/도커

[도커] 도커 5: docker 파일 2 (Dockerfile) - 도커 명령어

KyuminKim 2024. 11. 15. 11:10

지난 시간에 이어,

Dockerfile을 더 알아보자!


도커 파일 - 명령어 정리

도커 파일의 주요 instruction 중 명령어를 알아보자.

 

- 공통점: 도커 컨테이너에게 명령을 내린다

- 차이점: 명령어 실행 시점이 다르다

 

 

🙋‍♀️명령어 전달(실행) 방식 2가지

Docker파일의 명령어는

컨테이너에게 명령을 내린다고 했다.

 

이때, exec 방식또는shell 방식으로 명령어를 전달할 수 있다.

 

exec 방식 

["echo", "hi"]

shell 방식

echo hi

 

 

🙋‍♀️1. RUN

[실행 시점] 도커 파일로부터 이미지 빌드 시 실행되는 명령어

 

- 주로 라이브러리 설치 시 많이 사용
- 새로운 이미지 layer 생성

- 하나의 Dockerfile 여러번 지정 가능

FROM python:latest
RUN [“pip”, “install”, “numpy”]       # 적용 o (1) exec form ([] 안에 “”로 감싼 명령어 및 인자를 줌)
RUN  pip install cv2                  # 적용 o (2) shell form

 

🙋‍♀️2. CMD

[실행시점] 이미지로부터 컨테이너를 생성하여 최초로 실행 시 수행될 명령어 

 
- docker run에 명령어를 명시하는 경우, CMD내용은 실행 x (주의)
- Dockerfile 하나만 적용 (마지막 항목만 적용)
FROM ubuntu:22.04
CMD [“/bin/bash”, “echo hello”]          # 적용 x (마지막 하나만 적용), (1) exec form 
CMD /test/test_program1                  # 적용 o, (2) shell form
 

🙋‍♀️3. ENTRYPOINT

[실행시점] 이미지로부터 컨테이너를 생성하여 최초로 실행 시 반드시 수행될 명령어

 
- docker run에 명령어를 명시하더라도, ENTRYPOINT내용은 실행 o
- Dockerfile하나만 적용 (마지막 항목만 적용)
FROM ubuntu:22.04
ENTRYPOINT echo “hi”                       # 적용 x (마지막 하나만 적용)
ENTRYPOINT [“echo”, "hi"]                  # 적용 o

 

🙋‍♀️CMD와 ENTRYPOINT의 차이점

ENTRYPOINT는 반드시 실행한다는 점이 있다.

 

Dockerfile 과 docker run 명령어를 실행하자고 하자

FROM ubuntu:22.04
ENTRYPOINT [“echo”, "hello"]                          # 적용 o (echo “hello”)

우선 ENTRYPOINT로 지정해보자!

$ docker build -t test/testImg .

후 docker build로 testImg 이미지를 생성한다

$ docker run --name test test/testImg df

 

이때

echo hello 명령어가 실행될까? df 명령어가 실행될까?

정답은 echo hello다!

 

단, CMD ["echo", "hello"]로 dockerfile을 작성했다면,

CMD의 경우라면 df 명령어가 실행된다

 

 

🙋‍♀️CMD와 ENTRYPOINT를 같이 쓴다면?

FROM ubuntu:22.04
ENTRYPOINT echo “hi”                                  # 적용 x (마지막 하나만 적용)
CMD  [“hello”]                                        # 적용 o
ENTRYPOINT [“echo”]                                   # 적용 o (echo “hello”)

 

놀랍게도 CMD + ENTRYPOINT가 하나의 명령어가 된다!

 

ENTRYPOINT 명령어의 인자(parameter)가 CMD가 되는 것이다!

 

단, CMD가 명령어가 아님을 주의하자 

(이번 경우에는 "hello"로 명령어가 아니므로 patameter로 간주된다)

 

 

🙋‍♀️RUN, CMD, ENTRYPOINT 생성 시점 정리!

명령어 생성 시점 정리

 


참고

exec 방식과 shell 방식의 차이 https://velog.io/@bonjugi/Dockerfile-명령어-실행-형식-2가지-Exec-Shell

 


다음 시간에는 Docker 이미지 관련 심화 명령어를 알아보자!