docker buildx build
docker build
위 두 명령어를 수행하면 Dockerfile과 context로부터 Docker 이미지가 만들어진다.
Build Context가 뭔데?
`docker build` 명령어를 실행했을 때 접근 가능한 파일의 집합이다.
`build` 명령에서 특정 위치를 인자로 넘겨서 build에 사용할 context를 지정할 수 있다.
아래 명령어 같은 경우 `.` 현재 디렉토리를 기준으로 context를 생성해서 사용하겠다는 뜻 -> 현재 작업 디렉토리를 build context라고 한다. Dockerfile이 어디에 있던지 상관없이 현재 디렉토리에 있는 모든 파일과 디렉토리는 Docker 데몬에게 빌드 컨텍스트로 전달
docker build .
`-f` 플래그로 Dockerfile위치 지정하는 경우
mkdir -p dockerfiles context
mv Dockerfile dockerfiles && mv hello context
docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context
위처럼 Dockerfile과 hello를 다른 분리된 디렉토리로 옮기고 빌드 가능하다.
이미지를 만드는데 필요하지 않은 파일을 포함시키면 빌드 컨텍스트가 커지고, 이미지 크기도 커진다. 이미지 크기가 커지면 빌드에 걸리는 시간, push, pull에 소요되는 시간, 컨테이너 런타임 크키 등 모든 것이 늘어난다. 이 빌드 컨텍스트 크기를 보려면 Dockerfile 을 작성할 때 다음과 같은 메시지를 확인해보자.
Sending build context to Docker daemon 187.8MB
아래의 경로 중 하나를 택하여 build context를 지정할 수 있다.
- 로컬 디렉토리에 대한 상대경로 또는 절대 경로
- Git 저장소, Tarball 또는 일반 텍스트 파일의 원격 URL
- 표준 입력을 통해 `docker build` 명령에 연결된 평문 파일 또는 tarball?
FileSystem Contexts
빌드 컨텍스트가 로컬 디렉토리, Git 리포지토리 또는 tar 파일인 경우, 이는 빌더가 빌드 중에 엑세스할 수 있는 파일 세트가 된다.
`COPY`, ADD` 와 같은 Dockerfile에 사용되는 빌드 명령은 빌드 컨텍스트의 모든 파일 및 디렉토리를 참조할 수 있다.
파일 시스템 빌드 컨텍스트는 재귀적으로 처리 된다(?)
- 로컬 디렉토리나 tarball을 지정하면, 모든 하위 디렉토리가 포함된다.
- Git 리포지토리를 지정하면, 리포지토리와 모든 하위 모듈이 포함된다.
파일 시스템 컨텍스트로 사용할 수 있는 유형을 아래와 같다.
- local files
- git repository
- remote tarballs
Local Context
Local Build Context를 사용하기 위해서 상대 또는 절대 경로를 docker build 명령에 명시해주면 된다.
아래 명령어는 현재 디렉토리(`.`) 를 기준으로 빌드 컨텍스트를 생성한 것이다.
docker build .
...
#16 [internal] load build context
#16 sha256:23ca2f94460dcbaf5b3c3edbaaa933281a4e0ea3d92fe295193e4df44dc68f85
#16 transferring context: 13.16MB 2.2s done
...
위와 같이 빌드하면 현재 작업 디렉토리의 파일과 디렉토리를 빌더가 사용할 수 있다.
1. Local Directory 로 Local Context에서 빌드
다음과 같이 로컬 디렉토리가 구성되어 있다고 해보자
.
├── index.ts
├── src/
├── Dockerfile
├── package.json
└── package-lock.json
이 디렉토리를 컨텍스트로 넘겨주면 Dockerfile 명령어와 `build` 명령어에서 위 파일을 참조할 수 있다.
# syntax=docker/dockerfile:1
FROM node:latest
WORKDIR /src
COPY package.json package-lock.json .
RUN npm ci
COPY index.ts src .
2. stdin 을 활용한 Dockerfile로 Local Context에서 빌드
`Dockerfile`을 `stdin` 명령어로 파이핑하는 것은 디스크에 `Dockerfile`을 쓰지 않고 일회성으로 빌드하거나, `Dockerfile`이 있지만 이후에 삭제될 수도 있는 상황에서 유리하다.
다음과 같은 문장을 사용하면 `stdin` 과 Dockerfile을 사용해서 로컬 파일 시스템의 파일을 사용하여 이미지를 빌드할 수 있다.
docker build -f- <PATH>
`-f` 옵션을 사용해서 사용할 Dockerfile을 지정할 수 있다. `-`을 파일 이름으로 사용하여 `docker`가 `stdin`에서 Dockerfile을 읽도록 지시한다.
아래 예제는 현재 디렉토리를 빌드 컨텍스트로 `stdin`을 통해 입력받은 Dockerfile을 사용해 이미지를 빌드한다.
# create a directory to work in
mkdir example
cd example
# create an example file
touch somefile.txt
# build an image using the current directory as context
# and a Dockerfile passed through stdin
docker build -t myimage:latest -f- . <<EOF
FROM busybox
COPY somefile.txt ./
RUN cat /somefile.txt
EOF
ref
'DevOps > Docker' 카테고리의 다른 글
[Gitub Action] Pull Requst 했을 때 프로젝트 빌드 테스트하기 (1) | 2024.10.29 |
---|---|
[Docker] Multi-Stage (0) | 2024.10.23 |
[Docker] Dockerfile 살펴보기 (0) | 2024.10.19 |
[Docker] 캐시를 사용한 효율적인 빌드 수행 방법(1) - Docker Build Cache 무효화 (3) | 2024.10.19 |