Dockerfile
≡ 목차 (Table of Contents)
Dockerfile은 Docker 용 이미지를 빌드하기 위한 특수한 DSL 스크립트 언어로 작성하는 스펙 파일이다.
평범한 스펙 예제
FROM debian:buster RUN apt-get update && \ apt-get install -y build-essential python-dev python-pip ADD . /app RUN cd /app && \ make && \ make install && \ pip install -r requirements.txt ENV APP_NAME "sample" ENV APP_VERSION "1.0" ENTRYPOINT ["/usr/local/bin/app"]
이 이미지는 debian:buster
라는 리눅스 컨테이너에서 몇 가지 빌드에 필요한 도구들과 파이썬 도구들을 설치한 후 실제 앱을 빌드하고 실행시키는 내용을 포함하고 있다.
RUN
은 보다시피 실행시킬 명령어를 기입할 수 있는 커맨드다. 커맨드를 여러 줄에 나누어서 적어도 관계 없지만, 길이에 한계가 있기 때문에 이런 식으로 한 줄에 몰아서 적는 형태를 많이들 사용한다.
ADD
는 현재 빌드가 진행되고 있는 디렉터리의 내용물을 이미지에 몽땅 복사한다. 어쩌면 가장 중요한 명령이다.
ENV
는 이름에서 유추 가능하다시피 환경 변수(Environment Variable)를 설정하는 커맨드다.
ENTRYPOINT
는 실제로 이미지가 기동 되면 실행되는 셸 커맨드를 기입하는 곳이다. 이것 대신 CMD
로 기입할 수도 있다. 다만 CMD
는 ENTRYPOINT
와 비교해서 한 가지 특이점이 있는데, 만약 사용자 커맨드가 지정되면 CMD
로 명시한 명령어는 실행되지 않는다. 반면 ENTRYPOINT
는 사용자의 커맨드를 무시하고 실행된다.
사용자 지정
특정 사용자 권한으로 특정 명령을 실행하고 싶다면 USER
커맨드를 쓸 수 있다.
RUN groupadd -r someuser RUN useradd -m -r -g someuser someuser USER someuser
컨테이너가 root 유저 기반으로 돌아가니 꺼릴 게 없다.
Health Checking
이제는 서버가 떴는지 확인하기 위한 스크립팅을 지원한다.
HEALTHCHECK --interval=5s \ --timeout=5s \ --retries=6 \ CMD curl -fs http://localhost:1234/ || exit 1
Multi Stage Building
이미지를 작성하는 데 단계가 많다면 중간에 실패했을 때의 리스크가 너무 크다. 이럴 때는 스테이지를 나눠서 빌드하는 방법이 있다.
FROM someimage AS stage1 ... FROM stage1 AS stage2 ... # last stage FROM stage2 ...
이렇게 하면 특정 스테이지에서 중단되어도 이전 스테이지의 빌드 내용은 기록되어 있어서 다시 빠르게 시도할 수 있다.
외부 링크
- 🌏dockerfile-boilerplates: 다양한 언어 별 Dockerfile 템플릿 보일러플레이트 코드들이 올라오는 저장소