Jay's Cookbook
Menu
  • Tags
  • Categories
  • Projects
Computer Science
OS
Network
Data Structure
Algorithm
Language
Code Architecture
Python
Javascript
Typescript
Java
Backend
Backend Theory
TypeORM
Node.js
NestJS
FastAPI
Frontend
HTML/CSS
React
Next.js
Data Engineering
DE Theory
MySQL
MongoDB
Elastic
Redis
Kafka
Spark
Airflow
AI
Basic
Pytorch
NLP
Computer Vision
Data Analytics
Statistics
Pandas
Matplotlib
DevOps
Git
Docker
Kubernetes
AWS
[Docker] Dockerfile(2) RUN CMD ENTRYPOINT
devops
docker

[Docker] Dockerfile(2) RUN CMD ENTRYPOINT

Jay Kim
Jay Kim 03 Feb 2024
[Docker] Dockerfile(1) FROM LABEL ARG ENV [Docker] Dockerfile(3) COPY ADD VOLUME WORKDIR

Table of Contents

  • shell form exec form
    • exec form
    • shell form
  • RUN
  • CMD
  • ENTRYPOINT
  • 정리

shell form exec form

RUN, CMD, 그리고 ENTRYPOINT 인스트럭션은 두 가지 작성법이 있다

  • exec form: INSTRUCTION ["executable","param1","param2"]
  • shell form: INSTRUCTION command param1 param2

  • The shell form automatically uses a command shell, whereas the exec form does not.

exec form

  • 안의 값들은 반드시 쌍따옴표로 감싸줘야 한다
  • shell processing이 안 일어나기 때문에 $HOME 과 같은 변수의 치환이 발생하지 않는다. 필요하면 쉘을 직접 표기해야 한다 ([ "sh", "-c", "echo $HOME" ])

shell form

  • shell form은 자동으로 커맨드 쉘(/bin/sh -c)을 적용한다
  • 백슬래쉬(╲)로 하나의 인스트럭션을 여러 줄에 걸쳐 쓸 수 있다
RUN source $HOME/.bashrc && ╲
echo $HOME

# They're equivalent to the following line:

RUN source $HOME/.bashrc && echo $HOME
  • SHELL 인스트럭션으로 기본 쉘을 바꿀 수 있다
SHELL ["/bin/bash", "-c"]
RUN echo hello

RUN

RUN apt-get update
RUN apt-get install -y curl
  • RUN 인스트럭션은 빌드 단계에 실행할 명령어를 정의한다
  • RUN 인스트럭션은 새로운 레이어를 만든다
  • shell form이 주로 사용된다
  • 주로 패키지 설치, 빌드 명령어 등에 사용된다
  • Dockerfile에서 처음 빌드될 때 실행된 RUN 인스트럭션은 캐시되었다가 다음 빌드 때 사용된다. 캐시를 무효화 시키려면 docker build --no-cache 이런 식으로 --no-cache 플래그를 써줘야 한다

CMD

  • CMD 인스트럭션은 컨테이너가 실행될 때 실행할 명령어를 정의한다
  • CMD 인스트럭션은 Dockerfile에 하나만 있을 수 있다
  • CMD의 주목적은 실행중인 컨테이너에 디폴트를 제공하기 위함이다
  • 컨테이너가 생성될 때 실행된다 (stop되었다가 start될 때는 실행되지 않는다)
  • 디폴트에는 실행 가능한 것도 포함될 수도 있고, 생략한다면 ENTRYPOINT 인스트럭션에 반드시 포함시켜야 한다
  • CMD의 디폴트는 docker run에 의해 덮어씌어질 수도 있다
  • CMD가 ENTRYPOINT에 디폴트를 제공하기 위한 용도로 사용된다면 둘 다 exec form으로 작성해야 한다

ENTRYPOINT

  • 컨테이너가 실행될 때마다 실행된다 (stop되었다가 start 될 때마다 실행된다)
  • exec form이 선호된다 (shell form 쓰면 ₩ 인스트럭션이 사용되지 않는다)
  • ENTRYPOINT 인스트럭션은 CMD나 docker run과 다르게 덮어씌어지지 않는다

정리

  • 빌드 타임에만 필요한 명령어는 RUN 인스트럭션에 shell form으로 정의한다
  • 메인 프로세스와 같은 컨테이너가 실행될 때마다 같이 실행되어야할 명령어는 ENTRYPOINT에 exec form으로 정의한다
  • 디폴트로 전달하고 싶은 인자는 CMD에 exec form으로 정의한다
[Docker] Dockerfile(1) FROM LABEL ARG ENV [Docker] Dockerfile(3) COPY ADD VOLUME WORKDIR

You may also like

See all docker
10 Feb 2024 [Docker]: 진화하는 컨테이너 표준
devops
docker

[Docker]: 진화하는 컨테이너 표준

09 Feb 2024 [Docker] 네트워크 이해하기
devops
docker

[Docker] 네트워크 이해하기

도커에서 외부와의 통신, 컨테이너 간 통신 방법에 대해 배운다

08 Feb 2024 [Docker] 퍼시스턴시한 어플리케이션 만들기
devops
docker

[Docker] 퍼시스턴시한 어플리케이션 만들기

도커에서 데이터를 영구적으로 저장하는 방법에 대해 배운다

Jay Kim

Jay Kim

Web development, data engineering for human for the Earth. I share posts, free resources and inspiration.

Rest
Lifestyle
Hobby
Hobby
Hobby
Hobby
2025 © Jay's Cookbook. Crafted & Designed by Artem Sheludko.