Yoon.s

Dockerfile [1] 구성요소, FROM, CMD, ENTRYPOINT, ENV 본문

인프라/Docker

Dockerfile [1] 구성요소, FROM, CMD, ENTRYPOINT, ENV

yo_onHJ 2020. 7. 17. 13:16

Dockerfile 기반 image 생성

 

Dockerfile    ->    Docker image   ->   Docker container

              (build)                      (run)

 

Dockerfile 구성요소 

#주석

<명령><매개 변수>

 

*시작하기전, /home 디렉터리에 class라는 디렉터리를 만들어서 class에서 예제를 실행해보겠습니다! 

mkdir class

cd class

Dockerfile을 열어준다.
Dockerfile에 위와 같이 적어줍니다.

docker build <옵션><Dockerfile 경로>

옵션. -t 또는 --tag : +사용자ID/ 이미지 이름:tag (tag 작성 안할 시 기본 tag는 latest)

(Dockerhub에 올리기 위해 사용자 ID를 준다. 그렇지 않는 경우는 생략)

↑ docker images에는 현재 저희가 원하는 이미지가 없습니다! 

docker build --tag test:0.1 .

을 통해서 우리가 작성한 Dockerfile을 이미지로 build합니다! (--tag 옵션으로 네임은 0.1로 설정)

마지막에는 . 으로 현재 위치에 이미지를 저장하겠다는 것입니다! 

(* Dockerfile이 있는 위치에서 build 해야 합니다!!)

 

build가 끝나고, docker images를 확인하면 저희가 사용한 busybox:latest 이미지가 생성되고 

그 이미지를 가지고 새로 작성한 Dockerfile인 test:0.1 이미지가 생성되고 return 됩니다! 

 

 

그렇다면 위의 vi편집에서 사용한 FROM과 CMD는 어떤 의미일까요?

  • FROM
  • CMD 명령 | ["<실행파일>", "<매개변수1>", "<매개변수>",,,]

컨테이너가 실행될 때 일어날 프로세스 (한번만 실행됩니다)

/bin/sh 기반 실행

↑ 우선, 충돌을 방지하기 위해 cmd 디렉터리를 새로 생성합니다! (이름이 같을 시 충돌 가능성이 높아집니다)

그렇다면 build 할때 docker 경로는 현재위치가 아닌 cmd로 지정해야겠죠?!

 

컨테이너를 실행(run)하면 CMD 안에 있던 내용인 echo hello world가 실행되어 

hello wolrd가 출력되게 됩니다!! 

(--rm 옵션의 경우에는 ! 테스트 목적으로 실행하고 바로 삭제되도록 하기 위함입니다!! )

 

여기서 재미있는 부분은 :)

컨테이너 실행시 echo Love u라는 명령어를 추가하면 기존 내용은 사라지고  Love u가 덮어쓰기 되어 

출력됩니다!! 

 

 

  • ENTRYPOINT 명령 | ["<실행파일>", "<매개변수1>", "<매개변수>",,,]

CMD와 비슷해보이지만 큰 차이점을 가지고 있습니다!! 

이번에도 entry라는 디렉터리를 생성하고 시작합시다! (충돌방지)

Dockerfile에 CMD대신 ENTRYPOINT로 작성해보고 컨테이너를 실행시키면 hello world로 같은 결과가 나오죠?

 

하지만 CMD와 다른 점은 앞서 두번째 실행했던 부분에서 차이를 보입니다! 

컨테이너 실행 시 echo Love u 명령을 추가했을 때 

CMD는 기존 내용을 무시하지만 ENTRYPOINT는 무시하지않고 출력합니다! 

 

하지만 --entrypoint 옵션을 주시면 무시될 수 있습니다!! 

기존 내용 무시하고 cat을 열고 싶다! 라는 구문 입니다

 

  • ENV <환경변수><value>

환경변수를 만든다.

 RUN, CMD, ENTRYPOINT에 적용

 $ 변수 구문으로 사용

 -e (--env)옵션으로 overwrite 가능

 

env 디렉터리를 새로 생성하고 그 디렉터리에서 실행해보았습니다.

Dockerfile에 FROM, ENV, CMD 명령을 줍니다! 

Dockerfile 설명** busybox(태그 latest)를 가져와 ENV를 이용하여 CLASS 변수를 docker로 설정하고

CMD로 hello 다음에 CLASS(docker)를 읽어 출력하라는 의미입니다!! 

 

옵션  --env 적용

--env (-e)를 적용함으로써 CLASS에 docker가 아닌 Container로 바꿔줌으로서

overwrite되어 hello Container가 출력되게 됩니다.

Comments