오픈소스 프로젝트를 보다 보면 코드 내 Dockerfile
를 발견할 수 있다.
이러한 Dockerfile
은 프로젝트를 Docker Image
로 만들기 위한 규칙을 정의해 놓은 파일이라 할 수 있다.
Docker
에서 Dockerfile
를 읽어 image
를 만드는 것을 Build
라고 한다.
# syntax=docker/dockerfile:1
FROM ubuntu:latest
RUN apt-get update && apt-get install -y build-essentials
COPY main.c Makefile /src/
WORKDIR /src/
RUN make build
$ docker build -t test:latest .
FROM
을 통해 base image
를 정하고, 각각의 명령어(RUN
, COPY
, etc.)는 layer로 저장되게 된다.
docker build
명령을 실행하면 image
가 생성되게 된다.
-t
: 파일 이름을 설정.
: 현재 위치에서 빌드를 시작기존 이미지를 사용하지 않는 'parent image'를 만들고 싶다면 FROM scratch
를 이용해 만들 수 있다. Docker Docs: Build base-images
기존에 진행된 작업은 캐싱되어 같은 작업을 반복하지 않는다.
> Velog: Docker Caching 전략
git
에서 사용하는 .gitignore
와 같이, 빌드 과정에서 특정 파일을 무시 할 때는 .dockerignore
를 이용해 포함하지 않을 파일을 설정할 수 있다.
%% build context에서 제외할 수 있다고 나와있음 %%
좀더 자세한 내용은 dockeringore-files에서 알 수 있다.
ENV
등으로 지정된 환경변수의 경우에 명령어 내 ${variable_name}
또는 $variable_name
와 같은 형태가 발견되었을 때 값으로 교체된다.
ENV JAVA_HOME=/bin/java/
COPY javac.exe ${JAVA_HOME}
추가적인 기능으로는 다음과 같은 것이 있다.
${variable:-word}
: variable이 없을 때 word라는 값이 사용된다.${variable:+word}
: variable이 있을 때 word라는 값이 사용된다.FROM image
: 기존 이미지로부터 Layer를 추가함
RUN command
: 이미지 빌드시 실행될 명령어
CMD command
: 컨테이너가 생성될 때 실행될 명령어 (run 명령어에서 대체할 수 있음(실행 안될 수 있음))
ENTRYPOINT command
: 컨테이너가 생성될 때 실행될 명령어 (무조건 실행됨)
WORKDIR path
: 작업 디렉토리를 변경함
ENV key=value ...
: 환경변수를 설정함
VOLUME ["path"]
: 볼륨 마운트
EXPOSE port[/protocol]
: 애플리케이션이 수신받을 포트
COPY path1 path2
: 파일을 이미지로 복사함 (path1 to path2)
SHELL ["/bin/bash", "options"]
: 기본 명령 셸을 지정함
Docker Docs: Dockerfile Reference
Docker Docs: .dockerIgnore files
Docker Docs: cache management