FROM
부모 이미지 지정
- 가능한 공식 이미지를 사용
FROM alpine:latest
LABEL
이미지에 메타데이터를 추가
- 이미지에 대한 설명, 버전 정보, 작성자 정보 등
- 키-값 형태로 데이터를 저장
- 새로운 레이어를 생성하지 않고 메타데이터를 이미지에 추가
LABEL version="1.0" \\
description="Example" \\
maintainer="oneorz3601@gmail.com"
RUN
이미지에서 컨테이너 명령어를 실행
- 빌드하는 순간에만 실행되는 명령어
최신 버전의 패키지 설치를 위한 Cache Busting
# 1 빌드 인자 사용
ARG CACHEBUST=1 # 빌드 마다 이 값은 변경
RUN apt-get update
# 2. 빌드 인자 오버라이딩
ARG CACHEBUST=1
docker build --build-args CACHEBUST=$(date +%s) .
# 3. 자식 이미지에서 자신을 FROM할 때, 실행될 명령어 지정
# 웹 서버 구동용 인프라 이미지 생성과 개발 완료 후 데이터 삽입에 유용
RUN apt-get update
ONBUILD RUN apt-get update
# 4. URL 쿼리스트링
ADD "<https://example.com/file.tar.gz?v=${CACHEBUST}>" /tmp/file.tar.gz
패키지 버전 일관성을 위한 Version Pinning
RUN apt-get update && apt-get install -y \\
vim \\
git \\
s3cmd=1.1.* \\
&& python -m pip install requests==2.25.1
&& rm -rf /var/lib/apt/lists/* # apt 캐시 삭제 -> 이미지 크기 감소
공식 데비안, 우분투 이미지는 자동으로 apt-get clean을 실행함
CMD
이미지로부터 컨테이너를 생성하여 최초로 실행할 때 수행되는 명령어
- docker run 명령어로 오버라이딩이 가능
# Shell Form: 명령어가 일반 셸에서 입력하는 것처럼 실행됨
#> /bin/sh -c "CMD 명령어" 로 해석
#> docker run에 전달된 명령어로 동일하게 해석됨
CMD echo "hello"
# Exec Form: 프로그램을 직접 실행하며, 셸을 통하지 않고 실행됨
#> `CMD 명령어`로 해석
CMD ["echo",
- 일반적으로 오버헤드 방지, 일관된 동작 등의 이유로 Exec Form을 권장
ENTRYPOINT
CMD와 비슷하지만 docker run으로 오버라이딩 불가 (옵션으로 지정)
- CMD 및 docker run에 명시된 명령어는 ENTRYPOINT의 인자로 전달됨
CMD ["hello"] # 인자로 전달됨
ENTRYPOINT ["echo"]
> echo hello
# ENTRYPOINT 오버라이딩
docker run --entrypoint="" image echo overiding
EXPOSE
컨테이너가 외부와 통신하기 위한 포트를 지정
- 외부 포트와 매핑되는 것이 아니기 때문에 문서화 목적이 강함
# 단순 포트 노출
EXPOSE 80
# 다중 포트 노출
EXPOSE 80 443
# 프로토콜 지정
EXPOSE 80/tcp
EXPOSE 443/udp
ENV
환경변수 지정
- docker run —e 옵션을 통해 오버라이딩 가능
- 레이어 수가 증가되기 때문에 빌드 시에만 사용할 변수를 지정한다면 ARG를 권장
ARG
빌드 시점에만 사용될 변수 지정
- docker run —build-args 옵션을 통해 오버라이딩 가능
COPY
로컬 파일 시스템의 파일을 컨테이너의 파일 시스템으로 복사
- 기능이 단순하여 투명함(예측 가능성이 높음)
ADD
COPY 명령어 + 추가 기능
- 압축 해제: .tar 파일을 자동으로 압축 해제
- 원격 URL 지원: 원격 URL에서 파일을 다운로드하여 컨테이너에 추가 가능
빌드 캐시 무효화의 관점에서 아래의 방법이 효율적
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
# RUN 앞에 두었을 때보다 캐시 무효화가 적게 발생함
COPY . /tmp/
추가적인 기능이 필요하지 않다면 COPY를 사용하는 것을 권장
RUN mkdir -p /usr/local/src/my \\
&& curl -SL <https://example.com/file.tar.xz> \\
| tar -xJC /usr/local/src/my \\
&& make -C /usr/local/src/my all
VOLUME
기본적으로 도커 컨테이너는 휘발성이지만, 컨테이너의 디렉터리를 지정하면 해당 디렉터리를 호스트에서 관리하고 저장
- bind mount 방식과는 달리 도커가 자동으로 관리
- 기본적으로 /var/lib/docker/volumes에서 관리
VOLUME /app
# VOLUME
docker run -v /app image
# bind mount
docker run -v $(pwd):/app image
USER
컨테이너에서 사용할 유저를 지정
- USER 이후의 명령어는 지정된 유저의 권한으로 실행됨(사용자 전환)
- 고정된 UID, GID를 사용하는 것을 권장
ARG USERNAME=millet
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \\
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \\
USER $USERNAME
WORKDIR
작업 디렉터리 설정
- 명령어 이후의 모든 작업들이 해당 디렉터리에서 수행됨(컨테이너도 동일)
- 디렉터리가 존재하지 않다면 생성됨
WORKDIR /app
ONBUILD
현재 Dockerfile이 빌드된 후, 자식 이미지에서 실행될 명령어를 정의
- 자식 Dockerfile의 명령어보다 우선적으로 실행
ADD, COPY의 경우, 빌드 컨텍스트에 필요한 파일이 없다면 빌드 실패
- 이미지 태그에 image:proto-onbuild와 같이 명시하는 것을 권장
'서버관리 > 도커' 카테고리의 다른 글
Dockerfile의 개요 및 빌드 캐시 (0) | 2024.08.28 |
---|