본문 바로가기
반응형

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 로 다시 묶어 이미지 레이어를 조절할 수 있다.

728x90
반응형

'IT 공부 > PaaS' 카테고리의 다른 글

[Docker] Docker-compose 기본  (1) 2022.10.31
[Docker] 도커 모니터링  (0) 2022.10.31
[Docker] DockerFile 도커파일 1  (0) 2022.10.26
[Docker] 도커 이미지 관리  (0) 2022.10.26
[Docker] Log 확인 및 컨테이너 자원 할당  (0) 2022.10.25

한걸음 한걸음

개인적인 기록