docker compose 를 사용하여 환경을 구성하다가 service 의 command 라는 명령어를 만나게 되었다. docker image 빌드시에도 ENTRYPOINT 나 CMD 와 같이 컨테이너 실행 시 수행할 명령어를 설정하는 속성들이 있었는데, docker compose 의 command 를 통해서 명령어를 설정할 수 있었다. 이들의 관계와 어떻게 동작하는지 헷갈리는 부분들을 이번 글에서 정리해보았다.
1. docker compose 의 command
command 속성은 Dockerfile 의 CMD 와 같이 컨테이너 이미지에 기본적으로 선언되어 있는 기본 명령어, 컨테이너 동작 시 실행될 명령어를 오버라이드 한다.
만약 command 값이 null 이라면 이미지의 기본 명령어가 실행된다. 만약 비어있는 리스트나 빈 문자열로 정의하는 경우 기본 명령어는 빈 값으로 오버라이딩 된다.
command 를 사용하기 위해서는 docker-compose.yaml 을 정의할 때 아래와 같이 service 내부에 command 값을 정의한다.
services:
app:
image: sample-image
command: ["python", "app.py"]
command 로 설정된 명령어는 Dockerfile 의 CMD 와 달리 이미지의 기본 shell 명령어로 동작하지 않는다. 만약 shell 기능을 실행하고 싶다면 shell 로 명령어를 실행하도록 명시적으로 정의해주어야 한다. 아래는 shell 을 사용하여 ehco 를 실행하는 예시이다.
command /bin/sh -c 'echo "hello $$HOSTNAME"'
command 의 값은 Dockerfile 의 exec-form 과 같이 리스트로 정의할 수 있다.
2. command 동작 원리
docker 컨테이너 실행 프로세스는 다음과 같이 결정된다.
{실행 명령어} = ENTRYPOINT + CMD
ENTRYPOINT 와 CMD 는 Dockerfile 에 정의되는 속성으로 다음의 의미를 가진다.
- ENTRYPOINT: 컨테이너에서 실행할 실행파일
- CMD: ENTRYPOINT 에 전달되는 명령어, 인자 값
이 구성에서 docker compose 의 command 가 설정되면 Dockerfile 의 CMD 는 command 로 대체된다. 그리고 ENTRYPOINT 는 그대로 유지된다. 이로 인해 최종 실행 명령어는 아래와 같이 변경된다.
{최종 실행 명령어} = ENTRYPOINT + command
이렇게 CMD 는 외부 요인으로 변경될 수 있기 때문에 컨테이너의 수행마다 동일하게 유지되어야 하는 고정 명령어 또는 실행파일은 ENTRYPOINT 로 정의하고, CMD 는 메인 명령어 실행 시 주어지는 default arguments 들을 정의하는 것이 좋다. command 는 환경마다 달라지는 인자의 값으로 컨테이너를 실행하는 환경과 상황에 맞춰 지정해주면 된다.
[Rerences]
- https://docs.docker.com/reference/compose-file/services/#command
Services
Explore all the attributes the services top-level element can have.
docs.docker.com
- https://docs.docker.com/reference/dockerfile
- https://bluese05.tistory.com/77
Dockerfile Entrypoint 와 CMD의 올바른 사용 방법
ENTRYPOINT 와 CMD 는 무엇인가 ENTRYPOINT 와 CMD는 해당 컨테이너가 수행하게 될 실행 명령을 정의하는 선언문이다. 즉, 컨테이너가 무슨 일을 하는지 결정하는 최종 단계를 정의하는 명령이라고 생각
bluese05.tistory.com
'Infra > Docker' 카테고리의 다른 글
| [Docker] hosts 파일과 docker-compose extra_hosts (0) | 2025.03.11 |
|---|---|
| [Docker] Docker Root Directory (도커 스토리지) 변경 (0) | 2023.12.14 |
| [Docker] Docker vs VM (0) | 2022.07.28 |
| [Docker] Docker Compose (0) | 2021.09.05 |
| [Docker] Dockerfile 개념 정리 (0) | 2021.09.04 |