Dockerfile 은 Docker image를 어떻게 build 할지 지정하는 명령어 집합을 다룬 스크립트다.

 

Dockerfile 내부 구조

# OS - Ubuntu
FROM Ubuntu

# Update pip and install dependencies using pip
RUN apt-get update
RUN apt-get install python

# Install python dependencies using pip
RUN pip install flask
RUN pip install flask-mysql

# Copy source code to /opt folder
COPY . /opt/source-code

# Run the wbe server using 'flask' command
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run

# Pause 5 seconds after running the container
CMD ["sleep", "5"]

 


CMD vs. ENTRYPOINT

  • CMD : 컨테이너 실행 시 Default 명령어
  • ENTRYPOINT : CMD와 유사하지만, overriding은 어렵다

> ENTRYPOINT가 CMD에 비해 우선도를 가진다.

  • 만약 ENTRYPOINT와 CMD가 모두 설정되어 있다면
    • CMD는 ENTRYPOINT의 기본 변수 default aruemnt가 된다.
    • 따라서, ENTRYPOINT가 실행되면 CMD는 변수로써 전달된다.

※ Dockerfile 구조 예시

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]

 

1. 그대로 실행할 경우

# docker run myimage
Output : Hello, World!

 

2. CMD가 overriding 될 경우

# docker run myimage "Goodbye"
Output : Goodbye

 

3. ENTRYPOINT가 overriding 될 경우

# docker run --entrypoint /bin/bash myimage
기존 ENTRYPOINT("echo")를 무시하고 bash shell을 시작한다.

 

4, CMD와 ENTRYPOINT 모두 동시에 overriding 될 경우

# docker run --entrypoint "/bin/bash" myimage -c "echo Hello manually"
Hello manually

Dockerfile을 이용하여 Docker image build

# docker build -f <path-to-Dockerfile> -t <image_name>:<tag> <context>
docker build -f Dockerfile.dev -t python:lemona .

 

Dockerfile은 layered architecture 방식으로 동작한다.

 

이는 기존 Dockerfile에 약간의 변형 혹은 수정 후 다시 build 할 시 수정된 부분만 메모리를 소모할 뿐, 기존과 동일한 부분은 아무런 부담 없이 build 된다.

 

 

'CS > Container' 카테고리의 다른 글

[Docker] Docker Registry  (0) 2025.03.13
[Docker] Docker network & Docker-compose  (0) 2025.03.12
[Docker] Docker build & run 명령어  (0) 2025.03.08
[Container] Container vs. Virtual Machine  (0) 2023.10.11
[Container] 개념과 특징  (1) 2023.10.10