1. 도커 파일 여러 옵션들
root@k8s-node1:~/dockerFile# vi Dockerfile FROM ubuntu:14.04 #ENV 환경변수 설정 ENV test /home WORKDIR $test RUN touch $test/envtest #docker run -i -t --name env_test -e test=newhome [buildImage] /bin/bash #이미지를 빌드 후 위와같이 -e 옵션을 사용하면 내부 환경변수를 home -> newhome 으로 새로 지정할 수 있다. RUN mkdir /home/volume RUN touch /home/volume/volumetest #VOOLUME : 컨테이너 내부와 호스트 간 공유 VOLUME /home/volume #docker volume ls 명령어를 사용하면 해당 볼륨내용을 볼 수 있다. #ARG : 외부에서 변수를 입력받아 사용할 것이라고 명시 ARG arg1 RUN touch ${arg1}/argtest #docker build --build-arg arg1=/home -t argtest . 로 이미지를 빌드하면 arg1 의 값이 /home 이 된다. #arg 는 이미지 빌드시에 값을 넣고 env 의 -e 옵션은 이미지 빌드가 끝난 뒤에 넣는다. #ONBUILD 만든 이미지가 다른 이미지의 베이스 이미지가 되어 사용될 때 그 때 동작 ONBUILD RUN echo "ONBUILD" >> /onbuild_file #지금 만들어도 / 에 onbuild_file 이 생성되지 않는다. #이 dockerfile 의 이미지가 만들어진 후 그 이미지로 한번 더 만들어야 /onbuild_file 이 생긴다. #그렇게 생긴 자식이미지에는 ONBUILD 상속 X COPY test.html /home/ #COPY ["test.html", "/home/"] #로컬의 파일들을 추가할 수 있다. COPY [host로컬] [컨테이너] ADD test.html /home/ #ADD https://~~~.com/~~/*.html /home 처럼 URL로 가져올 수 있다. #ADD test.tar /home tar파일을 자동으로 풀어서 추가한다. #단 URL이나 tar로 추가 시 어떤 파일이 추가될지 정확하지 않기에 그다지 권장되지 않는다.
ENV : 환경변수 설정
VOLUME : -v 옵션, 볼륨공유
ARG : 외부에서 변수입력받아 사용
ONBUILD : 이 도커파일로 만든 이미지가 다른 이미지 빌드 시 사용 될때 그때 적용됨. (메이븐 설치 등에 사용된다고 함)
COPY : 로컬에서 파일 추가
ADD : 로컬 및 URL 로 파일 추가
2. entrypoint 와 cmd 차이
entrypoint 와 cmd 는 컨테이너가 시작될 때 수행하는 명령어를 지정하는 명령어이다.
차이점은 entrypoint 는 cmd 를 인자로 받아 스크립트의 역할을 할 수 있다는 것이다.
예시)
CMD : /bin/bash , ENTRYPOINT : 없음
-> 컨테이너 실행 시 /bin/bash 쉘 실행됨.
CMD : /bin/bash , ENTRYPOINT : echo
-> 컨테이너 실행 시 echo “/bin/bash” 가 실행되어 화면에 /bin/bash 라는 문자열이 찍힘
entrypoint는 인자를 받을 수 있다는 장점을 살려, 스크립트 쉘을 entrypoint 로 지정하여 많이 사용한다.
예를들어, 어떠한 절차를 수행하는 쉘을 만들어 도커 이미지 빌드시 넣고, 그 기동쉘을 entrypoint로 실행시킨다.
vi Dockerfile ... COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
entrypoint.sh 에는 컨테이너 실행 시 수행될 내용 (Tomcat 실행이라던지..) 를 넣을 수 있다.
vi entrypoint.sh echo $1 $2 ${CATALINA_HOME}/bin/startup.sh # ${CATALINA_HOME} 은 예시
만든 후 아래와 같이 실행하면
# docker run -d --name entrypoint_test entrypoint_image:latest test1 test2 ... (실행) # docker logs entrypoint_test test1 test2
인자로 받은 test1, test2 가 echo $1 $2 에 출력된것을 볼 수 있다.
* 여기서 ENTRYPOINT [“/bin/bash”, “./entrypoint.sh”] 라고 입력한 부분을 보면
JSON 배열 형태로 입력되었는데, 이 형태로 입력시에는 배열 그대로
# /bin/bash ./entrypoint.sh 가 수행되었다고 볼 수 있다.
그렇다면 이 배열형태로 입력하지않으면? (CMD 도 마찬가지)
CMD ["echo", "TEST"] -> echo TEST ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] -> /bin/bash /entrypoint.sh # 실제 수행 되는 명령어 /bin/bash /entrypoint.sh echo TEST # /entrypoint.sh 인자로 echo TEST 들어감.
CMD echo TEST -> /bin/sh -c echo TEST ENTRYPOINT /entrypoint.sh -> /bin/sh -c /entrypoint.sh # 실제 수행되는 명령어 /bin/sh -c /entrypoint.sh /bin/sh -c echo TEST # bash 가 아니여서 /entrypoint.sh 쉘이 실행되지 않음...
/bin/sh 와 /bin/bash , dash 차이는 따로 찾아보기
** Dockerfile 은 명령어 한줄마다 한개씩 이미지가 생기는걸 주의
vi Dockerfile ... ADD 100메가짜리 파일 ~~[100메가짜리파일로 작업]~~ RUN rm 100메가짜리 파일 삭제 ...
라는 도커파일을 만들어서 이미지를 빌드했다면, 최종 빌드된 이미지에는 100메가가 삭제되지 않고 남아있을 것이다.
ADD 100mb파일 의 이미지가 이미 100mb 가 더해진채 빌드되었고, 그 아래 RUN rm 100mb파일 로 파일을 지웠다 하더라도 이미 이미지는 100mb가 더해진 상태이기 때문이다.
만약 이 100mb 를 지우려면 && 연산자를 활용하여 RUN rm 명령어까지 하나로 묶어서 수행해야 한다.
ADD 100메가짜리파일 && ~~[파일관련수행]~~ && RUN rm 100메가짜리파일
그 외 용량을 줄이는 방법으로는 docker export 이후 docker import 로 다시 묶어 이미지 레이어를 조절할 수 있다.