하나의 Dockerfile에 여러 개의 From 을 쓸 수 있는데, 그걸 멀티 스테이지 빌드 라고 함
RUN
이미지 빌드 시점에 씀
필요한 패키지 설치한다거나 그럴 때 씀
이미지에 고정되는거임
RUN 명령을 한 줄로 묶는게 좋음. 왜냐면 한 줄이라도 바뀌면 그 부분부터 다시 명령 시작하기 때문
참고로 RUN 뒤에 오는 명령문은 /bin/sh -c 뒤에 붙어서 실행됨
-c 는 뒤에 오는 문자열을 직접 입력한 것 처럼 실행하겠다는 의미
아래는 예시 코드
FROM centos:7RUN yum -y update \ <- * 여기부터 && yum -y install \ curl \ vim \ iproute \ && yum clean all \ <- 이거 써서 캐시 싹 다 지워야 레이어가 깨끗해짐 && rm -rf /var/cache/yum <- * 여기까지 한 줄로 써야됨
주의 : 런타임 코드 쓰면 안됨!!!! (예시 : service nginx start)
COPY / ADD
호스트 (내 컴퓨터) 에 있는 파일을 컨테이너 안에다가 심는 작업
ADD보다는 COPY를 쓴다고 함 (안전상의 문제)
아래는 예시 코드
COPY . . <- 현재 호스트에서 작업하고 있는 부분을 컨테이너 안에 그대로 심음 (자주 씀)
깔아야 하는 패키지가 많은 경우에 아래의 방법처럼 쓰는 경우도 있음
COPY requirements.txt . <- 지금 requirements.txt 를 먼저 컨테이너 안에 심음RUN pip install -r requirements.txt <- 컨테이너 안에 들어간 requirements.txt 가지고 패키지 설치COPY . . <- 나머지 파일들 복사
참고 : gitignore 처럼 dockerignore도 있음. Dockerfile이랑 같은 디렉토리에 위치해 있으면 아래의 내용은 COPY 명령에서 제외됨
// .dockerignore.gitnode_modules*.log
WORKDIR
이 밑에 진행되는 명령들의 실행 디렉토리 설정
말 그대로임 cd 같은거임
WORKDIR /app
COPY로 다 가져오기 전에 WORKDIR로 폴더 나눠두면 나중에 관리하기 편하겠죠?
EXPOSE
해당 컨테이너가 사용하는 포트를 의미함
참고 : 쿠버네티스의 경우 알아서 해줘서 의미없긴함
EXPOSE 8080
CMD
컨테이너 실행할 때 자동으로 실행되는 명령
docker run “어쩌구” 이렇게 쓰면 CMD 내용 무시됨
예시
CMD ["python", "app.py"] <- 이러면 기본 docker run 할때 docker run python app.py 로 인식
ENTRYPOINT
항상 실행되는 고정 명령
CMD랑 같이 쓸 수도 있음
ENTRYPOINT ["nginx"]CMD ["-g", "deamon off"]
참고
CMD, ENTRYPOINT는 이미지를 컨테이너화 해서 실행시킬 때만 의미가 있는거고 모든 명령에 붙는게 아님!