본문 바로가기

Infra/Docker

[Docker Compose] command

반응형

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

 

반응형