DevOps/Docker

[Docker] Shell and Exec Form in dockerfile

Shell and Exec forms

  • RUN, CMD and ENTRYPOINT 명령어는 shell form과 exec form으로 특정될 수 있다.



shell form

<instruction> <command>

shell form의 <instuction>/bin/sh -c <command>의 형태로 command를 호출한다. (shell processing)


Examples:

RUN apt-get install python3
CMD echo "Hello World!"
ENTRYPOINT ehco "Hello World!"

Dockerfile

FROM busybox
ENV name iamjjanga
ENTRYPOINT echo "Hello, $name"

를 빌드히여 이미지로 실행해보면 다음과 같은 output을 얻을 수 있다.


$ docker build -t echo .
$ docker run -it echo
Hello, iamjjanga



exec form

  • CMDENTRYPOINT에서 많이 선호되는 form 형식
<instruction> ["executable", "param1", "param2"...]

exec form으로 실행시 직접적으로 바로 실행한다. 즉, shell exec에서 했던 /bin/sh -c의 shell processing은 일어나지 않는다.


Examples:

RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello World!"]
ENTRYPOINT ["/bin/echo", "Hello WOrld!"]

Dockerfile

FROM busybox
ENV name iamjjanga
ENTRYPOINT ["/bin/echo", "Hello, $name"]

빌드하고 실행해보면

Hello, iamjjanga



How to run bash?

  • 기본적으로 shell processing은 sh로 실행된다.

bash로 실행하기 위해서는 exec form을 통해 instruction을 /bin/bash로 지정해주면 된다.


ENV name iamjjanga
ENTRYPOINT ["/bin/bash", "-c", "echo Hello, World!"]

Ref