Dockerfile 명령어

2020. 2. 4. 15:45devops/docker

  • ENV: Dockerfile에서 사용할 환경변수를 설정합니다. 설정한 환경변수는 ${ENV_NAME} 또는 $ENV_NAME의 형태로 사용할 수 있습니다. 
FROM ubuntu:14.04
ENV test /home
WORKDIR $test // WORKDIR /home
RUN touch $test/mytouchfile

test /home으로 지정했다. container에 접속 후 echo $test를 통해 확인할 수 있습니다. 

container를 시작할 때 Dockerfile에 적힌것과 다르게 값을 줄 수 있습니다. 

docker run -it --name test \
-e test=newFolder \
이미지이름 /bin/bash

 

  • VOLUME
    빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부의 디렉터리를 설정합니다. 
    []배열형태도 되면 뒤로 쭉 나열해도 됩니다. 
FROM ubuntu:14.04
RUN mkdir /home/volume
VOLUME /home/volume

 

  • ARG
    build명령을 실행할 때 추가 입력을 받아 Docker 내에서 사용될 변수의 값을 설정합니다. build시에 --build-arg를 통해 설정할 수 있습니다. my_arg처럼 build할 때 입력받을 수도 있지만 my_arg2처럼 기본값으로 설정할 수 있습니다. 
FROM ubuntu:14.04
ARG my_arg
ARG my_arg2=value2
RUN touch ${my_arg}/mytouch



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

 

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

 

  • ONBUILD
    빌드된 이미지를 기반으로 하는 다른 이미지가 Dockerfile로 생성될 때 실행할 명령어를 추가합니다. 
    Dockerfile
FROM ubuntu:14.04
RUN echo "this is onbuild test"!
ONBUILD RUN echo "onbuild!" >> /onbuild_file

// build시에
docker build ./ -t onbuild_test:0.0

해당 이미지를 만든 다음 container를 만들면 ONBUILD RUN echo ... 명령어가 실행되지 않습니다. ONBUILD 명령어 때문인데요. 그러나 

Dockerfile2 

FROM onbuild_test:0.0
RUN echo "this is child image!"

그리고 Dockerfile2는 기존의 이미지 onbuild_test를 사용하여 이미지를 만들어줍니다. 이전 이미지에 ONBUILD로 명령어를 사용했기때문에 해당 명령어가 실행됩니다. 이와 같이 ONBUILD 명령어가 작성된 Dockerfile을 base로 실행될 때 ONBUILD 명령어가 실행됩니다. 

  • Stopsignal 
    컨테이너가 정지될 때 사용될 시스템 콜의 종류를 지정합니다. 기본 option은 SIGTERM로 설정됩니다. 아래와 같은 Dockerfile 작성을 통해 바꿀 수 있습니다. 
FROM ubuntu:14.04
STOPSIGNAL STOPCONTAINER

 

  • Healthcheck 
    이미지로 부터 생성된 컨테이너에서 동작하는 애플리케이션의 상태를 체크하도록 설정합니다. 컨테이너 안의 어플리케이션이 동작하고 있지 않은 상태를 방지하기 위해 사용될 수 있습니다. 
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

위의 Dockerfile 내용은 1분마다 curl -f로 명령어를 보내 해당 어플리케이션이 잘진해되고 있는지 확인하는 명령어입니다. 1분마다 보내며 응답이 3초내로 안오고 3번시도 끝에 실패하면 unhealty가 됩니다. 

해당 이미지와 같이 health라는 상태를 확인할 수 있다. 

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

 

  • COPY
    COPY는 로컬 디렉터리에서 읽어 들인 컨텍스트로부터 이미지에 복사하는 역할을 합니다. 
COPY test.html /home/
COPY ["test.html", "/home/"]

 

  • ADD
    ADD는 COPY와 같은 역할을 합니다. 그러나 COPY는 로컬의 파일만 이미지에 추가하는 반면에 ADD는 외부 URL, tar파일 에서도 파일을 추가할 수 있습니다. 

  • ENTRYPOINT
    CMD와 같이 컨테이너가 시작할 때 수행할 명령어를 지정한다는 점에서 같습니다. 그러나 ENTRYPOINT는 cmd를 인자로 받아 사용할 수 잇는 스크립트의 역할을 할 수 있다는 점에서 다릅니다. 
entrypoint: 없음, cmd: /bin/bash
docker run -it --name no_entrypoint ubuntu:14.04 /bin/bash 

entrypoint: echo, cmd: /bin/bash
docker run -it --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin/bash

첫경우에는 entrypoint 옵션이 없이 실행하였다. 그래서 cmd 명령어만 실행되었다. 그러나 두번째 경우에는 echo를 entrypoint로 지정해주었다. 그래서 container를 만들어보면 echo /bin/bash로 실행되어 shell로 들어가는 것이 아닌 /bin/bash로 출력된다. 

위와 같이 명령어를 실행시킬 수 있을 뿐만 아니라 script 파일을 실행시킬 수 있습니다. 

docker run -it --name entrypoint_sh --entrypoint="/test.sh" ubuntu:14.04

해당 파일이 컨테이너에 존재해야합니다. 그리고 Dockerfile에 작성하여 실행하는 방법도 있습니다. 

FROM ubuntu:14.04 
RUN apt-get update 
RUN apt-get install apache2 -y 
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh // 실행할 수 있도록 권한 부여
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

주의할 점 

배열과의 일반 명령어의 차이 

CMD echo test
-> /bin/sh -c echo test //실제 실행되는 명령어 

ENTRYPOINT /entrypoint.sh
/bin/sh -c /entrypoint.sh //실제 실행되는 명령어 

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

배열이 없을 때는 /bin/sh와 함께 실행됐는데 배열 형식은 작성한 명령어만 실행된다. 

  • CMD
    container가 만들어질 때 실행할 명령어를 설정한다. 
  • WORKDIR
    명령어등을  실행할 폴더를 지정합니다.  

  • EXPOSE
    호스트와 통신할 port를 지정합니다. 

  • RUN
    해당 명령어를 실행합니다. 

  • LABEL
    이미지에 메타데이터를 추가합니다. 이는 docker inspect명령어를 통해 작성한 정보를 확인할 수 있습니다. 

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

Docker compose  (0) 2020.02.08
Docker 구조  (0) 2020.02.04
docker build 과정  (2) 2020.02.02
docker file 작성  (0) 2020.01.31
docker image 배포  (0) 2020.01.31