Contents

Dockerfile 명령어

Dockerfile 포맷

하나의 Dockerfile은 기본적으로 다음과 같은 구조를 가진 여러 개의 명령문으로 구성되어 있다.

1
2
# 주석(Comment)
명령어(INSTRUCTION) 인자(arguments)

각 명령문은 명령어로 시작하고 여러 개의 인자가 따라올 수 있으며, 해당 명령문에 대한 주석도 달 수 있다. 인자와 구분이 쉽도록 명령어는 모두 영문 대문자로 써주는 것이 관례이다.

Dockerfile 명령문

  • FROM 명령문

    • 1
      2
      
      FROM <이미지>
      FROM <이미지>:<태그>
      
    • 하나의 Docker 이미지는 base 이미지부터 시작해서 기존 이미지위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층(layer)을 쌓아가며 만들어진다.
    • FROM 명령문은 이 base 이미지를 지정해주기 위해서 사용하는데, 보통 Dockerfile 내에서 최상단에 위치한다.
    • base 이미지는 일반적으로 Docker Hub와 같은 Docker repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많다.
  • WORKDIR 명령문

    • 1
      
      WORKDIR <이동할 경로>
      
    • WORKDIR 명령문은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용한다.
    • WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다.
  • ENTRYPOINT 명령문

    • 1
      2
      
      ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
      ENTRYPOINT <전체 커맨드>
      
    • ENTRYPOINT 명령문은 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드를 지정할 때 사용한다.
    • ENTRYPOINT 명령문은 Docker 이미지를 마치 하나의 실행 파일처럼 사용할 때 유용한다. 왜냐하면 컨테이너가 뜰 때 ENTRYPOINT 명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽을 때, 컨테이너도 따라서 종료되기 때문이다.
  • RUN 명령문

    • 1
      2
      
      RUN ["<커맨드>", "<파라미터1>", "<파라미터2>"]
      RUN <전체 커맨드>
      
    • RUN 명령문은 마치 쉘(shell)에서 커맨드를 실행하는 것 처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용한다.
    • 쉘(shell)을 통해 거의 못하는 작업이 없는 것 처럼 RUN 명령문으로 할 수 있는 작업은 무궁무진하지만 보통 이미지 안에 특정 소트트웨어를 설치하기 위해서 많이 사용된다.
  • CMD 명령문

    • 1
      2
      3
      
      CMD ["<커맨드>","<파라미터1>","<파라미터2>"]
      CMD ["<파라미터1>","<파라미터2>"]
      CMD <전체 커맨드>
      
    • CMD 명령문은 해당 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드나, ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용한다.
    • CMD 명령문은 많은 경우, ENTRYPOINT 명령문과 함께 사용하게 되는데, ENTRYPOINT 명령문으로는 커맨드를 지정하고, CMD 명령문으로 디폴트 파리미터를 지정해주면 매우 유연하게 이미지를 실행할 수 있게 된다.
    • CMD 명령문과 RUN 명령문이 햇갈릴 수가 있는데, RUN 명령문은 이미지 빌드 시 항상 실행되며, 한 Dockerfile에 여러 개의 RUN 명령문을 선언할 수 있다. 반면에, CMD 명령문은 이미지를 continaer로 띄울 때 딱 한 번 실행 기회를 가지게 되며, 이 기회마저도 docker run 커맨드에 인자를 넘길 경우 상실하게 된다.
  • EXPOSE 명령문

    • 1
      2
      
      EXPOSE <포트>
      EXPOSE <포트>/<프로토콜>
      
    • EXPOSE 명령문은 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜를 지정하기 위해서 사용한다. 프로토콜은 TCP와 UDP 중 선택할 수 있는데 지정하지 않으면 TCP가 기본값으로 사용된다.
    • 여기서 주의할 점은 EXPOSE 명령문으로 지정된 포트는 해당 컨테이너의 내부에서만 유효하며, 호스트(host) 컴퓨터에서는 이 포트를 바로 접근을 할 수 있는 것은 아니라는 것이다. 호스트 컴퓨터로부터 해당 포트로의 접근을 허용하려면, docker run 커맨드를 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩(forwarding)시켜줘야 한다.
  • COPY 명령문

    • 1
      2
      
      COPY <src>... <dest>
      COPY ["<src>",... "<dest>"]
      
    • COPY 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용한다.
    • 절대 경로와 상대 경로를 모두 지원하며, 상대 경로를 사용할 때는 이 전에 등장하는 WORKDIR 명령문으로 작업 디렉터리를 어디로 전환을 했는지 고려해야 한다.
  • ENV 명령문

    • 1
      2
      
      ENV <키> <값>
      ENV <키>=<값>
      
    • ENV 명령문은 환경 변수를 설정하기 위해서 사용한다. ENV 명령문으로 설정된 환경 변수는 이미지 빌드 시에도 사용됨은 물론이고, 해당 컨테이너에서 돌아가는 애플리케이션도 접근할 수 있다.
  • ARG 명령문

    • 1
      2
      
      ARG <이름>
      ARG <이름>=<기본값>
      
    • ARG 명령문은 docker build 커맨드로 이미지를 빌드 시, –build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용한다.

참고

https://www.youtube.com/watch?v=qexw7wbwkFM&list=PL93mKxaRDidGMzIllhYKx1d6aMg6_5wW3&index=15&pp=iAQB

https://www.daleseo.com/dockerfile/