ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dockerfile 작성 시 주요 명령어
    Linux 2020. 3. 20. 11:01
    반응형

    1. FROM

    어떤 이미지를 기반으로 새로운 이미지를 생성할 것인지를 나타냄

     

    1
    vi Dockerfile
    cs

     

    Dockerfile에 아래와 같이만 작성하고 저장한다.

     

    1
    docker build -t fromtest:0.0 .
    cs

     

    docker를 빌드한다.

    -t 옵션은 이미지 이름을 정의함

    뒤에 .은 Dockerfile의 위치

     

     

     

     

    2. RUN

    쉘에서 명령어를 입력하는 것과 같음

     

    Dockerfile에 RUN을 작성해보자

     

     

     

    1
    docker build -t runtest:0.0 .
    cs

     

    docker를 빌드한다.

     

    ubuntu:18.04 이미지를 가져오고

    mkdir /zerocool 을 실행하고

    echo "Hello!"를 실행하는 이미지를 만들었다.

     

     

    zerocool 폴더가 잘 생성되어있는것을 확인할 수 있다. 왜 echo "Hello!"는 실행되지 않는가?

     

    RUN 명령어는 Dockerfile로부터 이미지를 만들어 낼 때에 실행되는 것이다.

    즉, 이미지로 만들어 낸 다음에는 실행되지 않는다.

    실제로 build 명령어 중간에는 Hello! 가 잘 출력된 것을 볼 수 있다.

     

    3. ADD

    ADD 명령어는 build 명령 중간에 호스트의 파일 시스템으로부터 파일을 가져오는 것이다.

    이미지에 파일을 추가함

     

     

     

     

     

    위와 같이  hello.txt 파일을 생성한 다음

     

    docker file을 아래와 같이 수정함

     

    그 후 빌드한 뒤 컨테이너를 만들어보면 파일이 추가 된 걸 확인할 수 있다.

     

    4. ENTRYPOINT & 5. CMD

    컨테이너 시작 시, 실행될 명령어를 정하는 커맨드이기에 build로 이미지가 만들어지고, 그 이미지로 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다.

     

     docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행되며ENTRYPOINT는 Dockerfile에서 단 한번만 사용할 수 있다.

     

    사실 두 개의 명령어 CMD와 ENTRYPOINT는 컨테이너가 생성될 때 명령이 실행되는 것은 동일하지만 docker run 명령에서 동작 방식이 조금 다르다.

     

     

    ENTRYPOINT 와 CMD 의 가장 큰 차이점은 바로 컨테이너 시작시 실행 명령에 대한 Default 지정 여부이다.

     

    만약 ENTRYPOINT 를 사용하여 컨테이너 수행 명령을 정의한 경우, 해당 컨테이너가 수행될 때 반드시 ENTRYPOINT 에서 지정한 명령을 수행되도록 지정된다.

     

    하지만, CMD를 사용하여 수행 명령을 경우에는, 컨테이너를 실행할 때 인자값을 주게 되면 Dockerfile 에 지정된 CMD 값을 대신 하여 지정한 인자값으로 변경하여 실행되게 된다.


     

    그렇다면 ENTRYPOINT와 CMD 는 어떻게 사용하는게 좋을까.

     

    첫째로는, 컨테이너가 수행될 때 변경되지 않을 실행 명령은 CMD 보다는 ENTRYPOINT 로 정의하는게 좋다.

    컨테이너를 만들때 아마 대부분은 해당 컨테이너가 실행될 목적이 분명할 것이다.

    웹서버(nginx)가 될 수도 있고, App서버(node)가 될 수도 있으며 DB(mysql) 가 될 수도 있다.

     

    즉, 이미지를 만들때는 이러한 실행 목적이 분명하므로 nginx / node / mysql 같은 메인 프로세스가 될 명령의 경우는 ENTRYPOINT 로 정의하는게 명확할 것이다.

     

    두번째로는, 메인 명령어가 실행시 default option 인자 값은 CMD로 정의해 주는게 좋다.

    CMD 는 ENTRYPOINT 와 함께 사용시 추가 인자 값으로 활용 된다. 

    그러므로,  메인 프로세스에 대한 default 옵션값을 CMD 로 정의해주면 좋을 것이다. 

      

    추가로 ENTRYPOINT 와 CMD는 리스트 포맷 ( ["args1", "args2",...] )으로 정의해 주는게 좋다. 



     

     

    참고 : https://bluese05.tistory.com/77

            http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter07/06

            http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220646382977

     

     

    반응형

    댓글

Designed by Tistory.