이 글은 Dockerfile reference를 읽고 정리한 글입니다.
Dockerfile: 자동으로 이미지를 생성하는 문서
Format
# Comment INSTRUCTION arguments
Instruction은 대소문자를 구분하지 않지만 컨벤션은 agrument와 구분하기 위해 대문자를 사용한다.
FROM : 무조건 다커파일은 이 지시로부터 시작하며, 부모 이미지를 가리킨다.
주석: #으로 시작하는 줄을 주석으로 처리한다. 단 parser directive는 예외이다. 시작 부분이 아니면 주석으로 처리하지 않는다. 주석에선 line continuation character()가 먹히지 않는다.
instructin이나 주석 앞에 공백문자는 무시한다. 다만, argument의 공백문자는 인정된다.
Parse directives: 선택적이고, dockerfild이 다뤄지는 방법에 영향을 준다.
# directive=value
형태로 작성하며, dockerfile의 맨 앞에 위치해야하고 그렇지 않을 경우 주석으로 간주된다. 아래의 두가지 parser directives를 지원한다.- syntax => BuilKet 백엔드를 사용할 때만 가능
- escape =>
# escape = \
=> 백슬레시를 이스케이프 문자로 처리한다는 뜻
환경 변수
instuction ENV로 선언한다. 다커 파일 안에서
$variable_name
또는${variable_name}
로 사용할 수 있다.bash modifier와 함께 쓰일 수 있다.
${variable:-word}: variable이 선언되지 안았으면 word를 리턴하고, 선언됐으면 그 값을 리턴한다.
${variable:+word}: variable이 선언되지 안았으면 빈 문자열을 리턴하고 , 선언됐으면 word를 리턴한다.
만약 환경 변수를 대체하는 instruction와 같은 줄에 그 값을 할당하는 경우는 이전에 할당됐던 값으로 처리된다.
ENV a=H ENV a=c def=$a
위의 예시에서 def는 H이다.
.dockerignore file
docker CLI가 context를 데몬으로 보내기 전에 .dockeringnore파일을 컨텍스트의 루트 디렉토리에서 찾는다. 만약 찾으면, 패턴이 일치하는 파일과 폴더들을 제외시킨다. 나중에 ADD or COPY로 다시 포함시킬 수도 있다.# comment : 주석
/temp : temp로 시작하는 이름을이면서 루트의 바로 아래 디렉토리에 있는 파일과 디렉토리를 제외
_/*/_temp* : temp로 시작하는 이름이면서 루트로부터 두 레벨 아래에 있는 파일과 디렉토리 제외
temp? : 이름이 하나만 다른 파일과 디렉토리 제외
** : 모든 디렉토리(루트디렉토리 포함 포함)
!: 예외( = 포함)
*.md !README.md -> 포함
FROM
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image> [AS <name>]
FROM
을 통해 Base Image를 세팅하고 새로운 빌드 스테이지를 시작한다. Public Repositories에서 이미지를 pulling하는 것이 편하다.- ARG: FROM에 선행하는 instruction. FROM에 쓰이는 변수를 지정한다. FROM이후에는 쓰일 수 없으며, 쓰고 싶을 경우 FROM절 뒤에서 argument없이 ARG instruction을 한번 더 사용한다.
- FROM은 하나의 도커 파일 안에서 여러번 등장할 수 있으며, 여러 다커 이미지를 생성한다. 또는 하나의 빌드 스테이지를 의존성으로서 사용한다.
- AS name: 이것을 붙임으로서 선택적ㅇ로 하나의 빌드 스테이지에 이름을 지정해줄 수 있다. 그리고 나중에 FROM COPY에서 사용될 수 있다.
- tag 또는 digest: 선택적이며, 빠뜨리면 latest로 간주한다.
--platforom
: 선태적이며, linux/amd64와 같은 플랫폼을 특정할 수 있는데, 생략한ㄷ면 해당 빌드 요청의 target platform이 사용된다.
RUN
두 가지 형태가 있다.
RUN <command>
(shell form)RUN ["executable", "param1", "param2"]
(exec form)RUN을 실행하면 새로운 레이어가 형성되며 이 위해서 지정한 명령어가 실행되고 저장된다. 이 결과로 생성된 새로운 레이어는 도커 파일의 다음 스텝에서 사용된다.
- 레이어: 도커 파일에서 지시어를 실행할 때마다 이전 레이어 위에 새로운 레이어가 생성되며, 이 레이어들이 합쳐서서 새로운 이미지를 구성한다.
이는 배포 비용을 줄이기 위함인데, 레이어에서 지정한 부분만 이전 레이어에서 변경하는 방식이다.
- 레이어: 도커 파일에서 지시어를 실행할 때마다 이전 레이어 위에 새로운 레이어가 생성되며, 이 레이어들이 합쳐서서 새로운 이미지를 구성한다.
SHELL 명령어를 통해서 기본 shell을 변경할 수 있다.
shell form에서는
\
를 line continuation character로 사용한다.동일한 RUN 을 실행하며 형성된 레이어를 Cache로 사용하기 때문에, 최대한 적은 레이어를 만들기 위해 변경이 많은 RUN은 앞쪽에 배치하는 것이 좋다.
RUN --mount : 호스트의 파일시스템과 도커 컨테이너를 마운트할 수 있다. 기존 v 옵션보다 더 안정적으로 볼륨을 관리하고 캐시를 사용한다.
- syntex:
--mount=[type=<TYPE>][,option=<value>[,option=<value>]...]
- types
- bind : 기본값
- cache : 디랙토리들을 캐시하기 위해서 임시 디렉토리를 마운트한다.
- secret : secure file에 접근할 수 있도록함
- ssh: ssh에 접근할 수 있도록함
- RUN --mount=type=bind
- target: 컨테이너의 디렉토리
- source : 호스트 머신의 디렉토리
- from : source의 루트로서 스테이지 또는 이미지 이름을 형성
- syntex:
'Back-end > Docker' 카테고리의 다른 글
cAdvisor M1에 설치하기 (0) | 2023.04.21 |
---|---|
Dockerfile 공식문서 정리 2 (1) | 2023.04.19 |