ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dockerfile 명령어
    BackEnd/docker 2022. 3. 18. 21:27
    반응형

      해당 페이지에서는 Dockerfile의 명령어와 자주 쓰는 각종 build 옵션에 대해 알아보겠습니다. 전체 목록을 확인하고 싶다면 도커 공식 사이트의 Dockerfile 레퍼런스를 참고하기 바랍니다.

     

    • ENV: Dockerfile에서 사용될 환경변수를 지정합니다. 설정한 환경변수는 ${ENV_NAME} 또는 $ENV_NAME의 형태로 사용할 수 있습니다. 이 환경변수는 Dockerfile뿐 아니라 이미지에도 저장되므로 빌드된 이미지로 컨테이너를 생성하면 이 환경변수를 사용할 수 있습니다. 다음 Dockerfile에서는 test라는 환경변수에 /home이라는 값을 설정했습니다.
    # vi Dockerfile
    FROM ubuntu:14.04
    ENV test /home
    WORKDIR $test
    RUN touch $test/mytouchfile

     

    Note.

    ${env_name:-value}: env_name이라는 환경변수의 값이 설정되지 않았으면 이 환경변수의 값을 value로 사용

    ${env_name:+value}: env_name의 값이 설정돼 있으면 value를 값으로 사용, 설정되지 않았다면 빈 문자열 사용

     

    • VOLUMN: 빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부의 디렉터리를 설정합니다. VOLUMN ["/home/dir", "/home/dir2"]처럼 JSON 배열의 형식으로 여러 개를 사용하거나 VOLUMN /home/dir /home/dir2로도 사용할 수 있습니다.
    • ARG: build 명령어를 실행할 때 추가로 입력을 받아 Dockerfile 내에서 사용될 변수의 값을 설정합니다. ARG의 값은 기본적으로 build 명령어에서 입력받아야 하지만 다음의 my_arg_2와 같이 기본값을 지정할 수도 있습니다.
    # vi Dockerfile
    FROM ubuntu:14.04
    ARG my_arg
    ARG my_arg_2=value
    RUN touch ${my_arg}/mytouch

      build 명령어를 실행할 때 --build-arg 옵션을 사용해 Dockerfile의 ARG에 값을 입력할 수 있습니다. 입력하는 형식은 '<키>=<값>'과 같이 쌍을 이뤄야 합니다.

    $ docker build --build-arg my_arg=/home -t myarg:0.0 ./

     

    Note. Dockerfile에서 ARG로 설정한 변수를 ENV에서 같은 이름으로 다시 정의하면 --build-arg 옵션에서 설정하는 값은 ENV에 의해 덮어쓰여집니다.

     

    • USER: USER로 컨테이너 내에서 사용될 사용자 계정의 이름이나 UID를 설정하면 그 아래의 명령어는 해당 사용자 권한으로 실행됩니다. 일반적으로 RUN으로 사용자의 그룹과 계정을 생성한 뒤 사용합니다. 루트 권한이 필요하지 않다면 USER를 사용하는 것을 권장합니다.
    ...
    RUN groupadd -r author && useradd -r -g author hanseomkim
    USER hanseomkim
    ...

     

    • HEALTHCHECK: HEALTHCHECK는 이미지로부터 생성된 컨테이너에서 동작하는 애플리케이션의 상태를 체크하도록 설정합니다. 컨테이너 내부에서 동작 중인 애플리케이션의 프로세스가 종료되지는 않았으나 애플리케이션이 동작하고 있지 않은 상태를 방지하기 위해 사용될 수 있습니다.

     

      다음은 1분마다 curl -f...를 실행해 nginx 애플리케이션의 상태를 체크하며, 3초 이상이 소요되면 이를 한 번의 실패로 간주합니다. 3번 이상 타임아웃이 발생하면 해당 컨테이너는 unhealthy 상태가 됩니다. 단, HEALTHCHECK에서 사용되는 명령어가 curl이므로 컨테이너에 curl을 먼저 설치해야 합니다.

    # vi Dockerfile
    FROM nginx
    RUN apt-get update -y && apt-get install curl -y
    HEALTHCHECK --interval=1m --timeout=3s --retries=3 CMD curl -f http://localhost || exit 1
    • --interval: 컨테이너의 상태를 체크하는 주기
    • CMD curl...: 상태를 체크하는 명령어

      이미지를 빌드한 후 해당 이미지로 컨테이너를 생성하면 docker ps의 출력 중 해당 컨테이너의 STATUS에 정보가 추가된 것을 확인할 수 있습니다. 상태 체크에 대한 로그는 컨테이너의 정보에 저장되므로 애플리케이션에 장애가 있을 때 해당 로그를 확인할 수 있습니다. 이는 docker inspect 출력 중 State - Health - Log 항목에서 확인할 수 있습니다.

     

    • SHELL: 기본 셸을 지정합니다. Dockerfile에서 기본적으로 사용하는 셸은 리눅스에서 "/bin/sh -c", 윈도우에서 "cmd /S /C"입니다.
    FROM node
    RUN echo hello, node!
    SHELL ["/usr/local/bin/node"]
    RUN -v

     

    • COPY: 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 파일을 복사하는 역할을 합니다. COPY와 ADD의 기능은 그 자체만으로 봤을 때는 같습니다. 그러나 COPY는 로컬의 파일만 이미지에 추가할 수 있고, ADD는 외부 URL 및 tar 파일에서도 파일을 추가할 수 있습니다.
    COPY test.html /home/
    COPY ["test.html", "/home/"]
    ADD https://.../test.html /home
    ADD test.tar /home              # tar파일을 자동으로 해제해서 추가합니다.

     

    • ENTRYPOINT: ENTRYPOINT는 CMD와 동일하게 컨테이너가 시작될 때 수행할 명령을 지정한다는 점에서 같습니다. 그러나 ENTRYPOINT는 커맨드를 인자로 받아 사용할 수 있는 스크립트의 역할을 할 수 있다는 점에서 다릅니다.
    $ docker run -i -t --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin/bash
    /bin/bash

      entrypoint가 설정되지 않았다면 cmd에 설정된 명령어를 그대로 실행하지만 entrypoint가 설정됐다면 cmd는 단지 entrypoint에 대한 인자의 기능을 합니다.

     

      일반적으로는 스크립트 파일을 entrypoint의 인자로 사용해 컨테이너가 시작될 때마다 해당 스크립트 파일을 실행하도록 설정합니다. 스크립트 파일을 entrypoint에 설정하려면 스크립트 파일의 이름을 entrypoint의 인자로 입력합니다.

    $ docker run -i -t --name entrypoint_sh --entrypoint="/test.sh" ubuntu:14.04 /bin/bash

      다음 Dockerfile은 스크립트 파일을 이용해 ENTRYPOINT를 사용하는 예를 보여줍니다.

    # vi Dockerfile
    FROM ubuntu:14.04
    RUN apt-get update
    RUN apt-install apache2 -y
    ADD entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    ENTRYPOINT ["/bin/bash", "entrypoint.sh"]

     

    Note. JSON 배열 형태와 일반 형식의 차이점

      CMD 또는 ENTRYPOINT에 설정하려는 명령어를 /bin/sh로 사용할 수 없다면 JSON 배열의 형태로 명령어를 설정해야 합니다. JSON 배열 형태가 아닌 CMD와 ENTRYPOINT를 사용하면 실제로 이미지를 생성할 때 cmd와 entrypoint에 /bin/sh -c가 앞에 추가되기 때문입니다.

    CMD echo test
    # -> /bin/sh -c echo test
    
    ENTRYPOINT /entrypoint.sh
    # -> /bin/sh -c /entrypoint.sh

      CMD와 ENTRYPOINT를 JSON 형태로 명령어를 입력하면 입력된 명령어가 그대로 이미지에서 사용됩니다.

    CMD ["echo", "test"]
    # -> echo test
    
    ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
    # -> /bin/bash /entrypoint.sh
    반응형

    'BackEnd > docker' 카테고리의 다른 글

    도커 컴포즈(Docker Compose)  (1) 2022.03.24
    도커 데몬(Docker Daemon)  (0) 2022.03.19
    Dockerfile  (0) 2022.03.16
    이미지 배포(Image Deploy)  (0) 2022.03.15
    도커 이미지(Docker Image)  (0) 2022.03.15

    댓글

Designed by Tistory.