▶︎ Build Context
Dockerfile
FROM nginx:1.23
LABEL description="01. 이미지 빌드 실습"
COPY ./index.html /usr/share/nginx/html/index.html
CMD [ "nginx", "-g", "daemon off;" ]
빌드 컨텍스트는 빌드에 필요한 모든 파일들을 모아놓은 디렉토리 라고 간단하게 요약할 수 있겠다.
빌드 컨텍스트에 모든 필수 요소들을 넣어놓고
빌드를 실행하면 도커 엔진은 빌드 컨텍스트로 지정된 디렉토리를 전달받게 되고,
거기서 필요한 파일들을 참조하면서 빌드를 수행하게 됨.
만약 하나라도 빠져있다면 빌드 중 에러를 만나게 될 것.
💥 빌드 컨텍스트의 경로 설정은 매우 중요하다!
도커 파일을 별도의 폴더에서 관리하는 것은 매우 중요하다.
예를 들어, Dockerfile이 C 드라이브 최상단에 위치한다면 이 도커 파일이 포함된 C 드라이브 전체가 Build Context가 되어버린다.
이는 빌드 컨텍스트가 도커 데몬에게 전달돼야 하기 때문에
빌드 컨텍스트의 크기가 커지면 커질수록 전송 시간이 길어지고,
이 폴더의 크기가 비정상적으로 커지면 빌드에 문제가 발생할 가능성이 높아진다.
그래서 도커파일과 빌드에 사용되는 파일만 별도의 폴더로 관리해야 한다!
▶︎ Dockerfile
- docker 이미지를 작성할 수 있음
- Dockerfile 문법으로 이미지 생성을 위한 스크립트 작성 , 이를 기반으로 이미지 생성
- 나만의 이미지 커스터마이징 , 배포 위하여 많이 사용됨
‣ 기본 문법
- Dockerfile은 텍스트 파일 형식, 어떤 에디터로든 작성가능
- 기본적으로 간단히 명령과 인자로 이루어짐
- 명령은 통상적으로 대문자로 작성 (소문자로 작성해도 되지만 , 구분을 위하여 대문자로 통일)
‣ 지시어 #1
지시어 | 설명 |
---|---|
FROM |
베이스 이미지 지정명령 EX. FROM httpd:alpine |
LABEL |
버전 정보 , 작성자와 같은 이미지 설명을 작성하기 위한 명령 EX. LABEL version="1.0.0" |
CMD |
docker 컨테이너가 시작할 때 , 실행하는 쉘 명령 지정하는 명령 , RUN과 비슷하지만 RUN은 이미지 작성 시 실행하는 명령어 , CMS는 컨테이너 시작할 때 실행하는 명령 EX. CMD ['python','app.py'] |
RUN |
쉘 명령을 실행하는 명령 EX. RUN ["apt-get","install","nginx"] |
ENTRYPOINT |
docker 컨테이너가 시작할 때 , 실행하는 쉘 명령 지정하는 명령 , docker run 실행시 별도 명령어 삽입 가능한데 , 이 때 CMD 명령은 해당 명령으로 덮어씌워짐 |
EXPOSE |
docker 컨테이너 외부에 오픈할 포트 설정 EX. EXPORT 8080 |
ENV |
docker 컨테이너 내부에서 사용할 환경 변수 지정 EX. ENV PATH /usr/bin:${bash} |
WORKDIR |
docker 컨테이너에서의 작업 디렉토리 설정 |
COPY |
파일 또는 디렉토리를 docker 컨테이너에 복사.ADD와 달리 URL 지정 불가 , 압축 파일 자동으로 풀어주지 않음 Ex. COPY test.sh /root/test.sh |
ARG |
dockerfile 내에서 필요한 변수 설정. docker 이미지/컨테이너에서 사용하는 환경 변수를 설정하는 ENV와 달리 , dockerfile 스크립트 작성을 위해 필요한 변수 설정 EX. ARG env=dev |
USER |
docker 이미지 및 컨테이너에서 작업을 하는 사용자 ID를 지정EX: USER jaehyo |
ONBUILD |
생성한 이미지를 기반으로 , 새로운 이미지를 생성시 실행하는 명령을 지정 EX. ONBUILD ADD myweb.tar /var/wwwh/html |
VOLUME |
이미지를 위한 볼륨생성 ❗️호스트PC의 특정 볼륨과 연결시키는 것이 아님 |
‣ 명령어 치환
자주 사용할 일은 없지만 도커파일에서는 명령어 치환(Command Subtitution)도 사용 가능하다
일반적으로 RUN
지시어 내에서 셸 명령을 실행할 때 사용된다.
# 빌드 이미지로 OpenJDK 11 & Gradle을 지정
FROM gradle:7.6.1-jdk11 AS build
.. 명령들
# Gradle 빌드를 실행하여 JAR 파일 생성
RUN gradle clean build --no-daemon
RUN cp "build/libs/$(ls -lh build/libs/ | grep "SNAPSHOT.jar$" | awk '{print $9}')" leafy.jar
.. 명령들
‣ 이미지 빌드
docker build -t <Dockerfile 경로>
docker build --tag yshrim12/nginx .
‣ 주요 옵션
-t
또는--tag
- 이미지 이름 설정 , 이미지 이름은 저장소(DockerHub ID)/이미지이름:태그 와 같이 작성
- (저장소 이름 및 태그 이름은 작성 안해도 됨 , 태그 이름이 없는 경우 , 디폴트로 latest가 태그로 붙여짐)
-f
: 이미지 빌드시 디폴트로 Dockerfile 파일명으로 된 파일을 찾아서 , 이미지를 빌드함. 그 외의 파일명으로 이미지를 빌드할 경우 해당 옵션 사용해서 파일명 지정--pull
: FROM 으로 지정된 이미지는 한번 다운로드 받으면 , 이미지 생성 시 마다 새로 다운로드 받지 않고 다운로드 받은 이미지를 사용- 해당 옵션은 이미지 생성시마다 새로 다운로드 받으라는 명령.
--pull=true
와 같이 작성
- 해당 옵션은 이미지 생성시마다 새로 다운로드 받으라는 명령.
▶︎ 이미지 빌드 실습
‣ 예제 (1)
- 위에서 작성한 Dockerfile 이 있는 동일 경로에서 다음과 같이 명령
--tag
myimage는 이미지 이름을 myimage로 설정한 것이므로 , 디폴트 태그가 붙어 myimage:latest로 작성되었음- 마지막의 '.'은 현재 폴더를 나타낸 것 , 현재 폴더의 Dockerfile 실행
docker build --tag yshrim12/myimage:1.0 .
‣ 예제 (2)
# 예제2 (-f) : 다른 파일명의 Dockerfile 빌드하기
$ cp ./Dockerfile ./Dockerfile2
$ docker build --tag myimage2 -f Dockerfile2 ./
$ docker images
‣ 예제 (3)
# 예제3 (--pull)
$ docker build --tag myimage3 -f Dockerfile2 ./ --pull=true