Dockerfile

Younghwan Cha·2021년 11월 17일
0

Docker

목록 보기
2/18
post-thumbnail

FROM

RUN

이미지 위에 다른 패키지(프로그램)를 설치하고 새로운 레이어를 생성할 때 사용한다.
여기서 레이어란, 도커 이미지를 구성하는 요소로 도커는 컨테이너 레이어를 쌓아서 컨테이너를 구성한다.

RUN apt-get install wget

WORKDIR

이동할 경로 지정

CMD

CMD 는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다.

docker run  | docker start 명령으로 컨테이너가 시작할 때 실행된다.

CMD 는 한 번만 사용할 수 있다

CMD 의 주용도는 컨테이너를 실행할 때 사용할 defualt 값을 설정하는 것이다.

CMD [“executable”,”param1”,”param2”] (exec form, this is the preferred form)
CMD [“param1”,”param2”] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

FROM ubuntu
CMD echo "This is a test."

위와 같이 Dockerfile 을 만들고 docker run 을 했을 때 다음과 같이 실행된다

$ docker run -it --rm <image-name>
This is a test

하지만 echo "Hello" 라고 실행 커맨드를 주게되면

$ docker run -it --rm <image-name> echo "Hello"
Hello

다음과 같이 본래의 echo "This is a test" 명령어는 echo "Hello" 에 덮어씌워진다
이와 같이 CMD 는 여러번 사용할 수 있지만 가장 마지막 CMD 하나만 남게된다

ENTRYPOINT

이미지를 컨테이너로 띄울 때 항상 실행되어야 하는 커맨드를 지정할 때 사용한다
컨테이너가 뜰 때 ENTRYPOINT 가 실행되고
커맨드로 실행된 프로세스가 죽을 때 컨테이너도 종료된다

ENTRYPOINT [“executable”, “param1”, “param2”] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

다음과 같은 Dockerfile 실행시

FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
$ docker run -it --rm <image-name>
Hello world
$ docker run -it --rm <image-name> ME
Hello ME

위와 같이 CMD 는 default 파라미터로써의 역할을 하고 따로 docker run 명령 시에 파라미터를
전달해 주면 CMD 에서 설정한 파라미터는 사용되지 않는다

exec form : 그대로 반환

FROM ubuntu
ENTRYPOINT [ "echo", "$HOME" ]

$ docker run -it --rm <image-name>
$HOME

shell form : 변수 반환

FROM ubuntu
ENTRYPOINT echo $HOME
$ docker run -it --rm <image-name>
/root

예를 들어, node 커맨드로 디폴트로는 index.js를 실행하되, docker run 커맨드에 인자가 있는 경우, 해당 인자를 실행하고 싶은 경우, 다음과 같이 Dockerfile을 작성합니다.

ENTRYPOINT ["node"]
CMD ["index.js"]

그러면 다음과 같이 docker run 커맨드의 인자 유무에 따라 node 커맨드로 다른 파일이 실행되게 할 수 있습니다.

node index.js 실행

$ docker run test

node main.js 실행

$ docker run test main.js

EXPOSE

EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜를 지정하기 위해서 사용됩니다. 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용됩니다.

여기서 주의할 점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너의 내부에서만 유효하며, 호스트(host) 컴퓨터에서는 이 포트를 바로 접근을 할 수 있는 것은 아니라는 겁니다. 호스트 컴퓨터로부터 해당 포트로의 접근을 허용하려면, docker run 커맨드를 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding)시켜줘야 합니다.

80/TCP 포트로 리스닝

EXPOSE 80

9999/UDP 포트로 리스닝

EXPOSE 9999/udp

COPY

이미지를 빌드한 디렉터리의 모든 파일을 컨테이너의 app/ 디렉터리로 복사

WORKDIR app/
COPY . .

RUN vs CMD

RUN 명령문은 이미지 빌드 시 항상 실행되며, 한 Dockerfile에 여러 개의 RUN 명령문을 선언할 수 있습니다. 반면에, CMD 명령문은 이미지를 continaer로 띄울 때 딱 한 번 실행 기회를 가지게 되며, 이 기회마저도 docker run 커맨드에 인자를 넘길 경우 상실하게 됩니다.

번외

#!/bin/sh

#! 란, 스크립트를 실행할 쉘을 지정하는 선언문이다

ls -al /bin/sh 
		/bin/sh -> dash

ubuntu 리눅스는 dash shell 을 사용하는 것을 알 수 있다

https://storycompiler.tistory.com/101

profile
개발 기록

0개의 댓글