DockerFile
: docker 컨테이너를 실행할 때 바탕이 되는 이미지를 만들기 위해 작성하는 파일
- 도커 파일의 구조
: 대문자로 이루어진 지시어 (instruction으로 구성)
: FROM / RUN / ENV / CMD 등
- 예시
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
FROM
: 베이스 이미지 (Base Image)를 지정
: 지정된 이미지를 도커 이미지 레지스트리(저장소)인 docker hub로 부터 다운로드 받고, 이를 바탕으로 이미지를 빌드
FROM [--platform=<platform>] <image>[:<tag>|@<digest>] [AS <name>]
# --platform = 이미지의 플랫폼. windows/amd64, linux/arm64 등
# image = 지정할 이미지
# tag = 이미지의 태그명 (일종의 버전)
# digest = 태그의 다이제스트 값 (일종의 버전)
# AS = 지정한 이미지의 별명 (멀티 스테이지 빌드 시 이용)
FROM ubuntu:18.04
RUN
: 도커 이미지 내에서 실행할 명령어를 지정
: 컨테이너 이미지를 빌드할 때 실행
: shell form 형식과 exec form 형식이 존재
RUN <command>|["executable", "param1", "param2"]
RUN /bin/bash -c update.sh
RUN ["/bin/bash", "-c", "update.sh"]
CMD
: 컨테이너가 시작될 때 실행할 명령어를 지정
: 빌드가 완료되고 컨테이너의 실행이 시작될 때 실행됨
: docker run 명령으로 직접 실행할 명령어를 지정하여 컨테이너를 실행할 경우 CMD의 명령어는 실행되지 않음
CMD <command>|["executable", "<param1>", "<param2>"]
CMD /bin/bash -c update.sh
CMD ["/bin/bash", "-c", "update.sh"]
ENTRYPOINT
: 컨테이너가 시작될 때 실행할 명령어를 지정
: 빌드가 완료되고 컨테이너의 실행이 시작될 때 실행됨
: CMD와 다른 점은 docker run 명령으로 직접 실행할 명령어를 지정하면 ENTRY POINT의 파라미터로 인식이 됨
: 한 도커 파일 내에서 ENTRYPOINT가 여러 개 나올 경우 맨 마지막 줄의 명령만 유효 (한 번만 작성 가능)
ENTRYPOINT <command>|["executable", "<param1>", "<param2>"]
ENTRYPOINT /bin/bash -c update.sh
ENTRYPOINT ["/bin/bash", "-c", "update.sh"]
LABEL
: 메타데이터를 지정
LABEL <key>=<value> <key>=<value> <key>=<value>
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
ENV
: 환경변수를 설정
: 컨테이너가 실행되고 나서도 유효
: docker run -e 옵션으로 덮어쓰기 가능
ENV <key>=<value> <key>=<value> <key>=<value> ...
ENV NAME="Toram"
ENV VERSION=$NAME
ARG
: 도커 이미지를 빌드할때 초기화 할 수 있는 변수 (기본 값이 없어도 됨)
: docker build --build-arg <변수명>=<값> 명령으로 ARG 변수명을 초기화 가능
: FROM 보다 위에 위치할 수 있어, 이를 통해 유동적으로 베이스 이미지를 지정할 수 도 있다
: 이미지를 빌드할때만 유효
ARG 변수명=값
ARG NAME
ARG VERSION=latest
FROM busybox:$VERSION
EXPOSE
: 컨테이너가 실행될 때 호스트에 공개할 포트 지정
: 컨테이너 내부의 프로세스가 8000번 포트로 통신한다면 EXPOSE로 8000번 포트를 열어야 데이터를 받을 수 있다
EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80/tcp
EXPOSE 80/udp
ADD
: 컨테이너로 복사할 호스트에 있는 파일 또는 디렉터리
: URL을 지정하여 네트워크에서 받아와야하는 파일 및 디렉터리도 복사 가능
ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
ADD hom?.txt /mydir/
ADD --chown=myuser:mygroup --chmod=655 files* /somedir/
ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz /
ADD . /dist_dir
COPY
: 컨테이너로 복사할 호스트에 있는 파일 또는 디렉터리
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY hom?.txt /mydir/
COPY --chown=myuser:mygroup --chmod=644 files* /somedir/
COPY . /dist_dir
USER
: 컨테이너 내에서 명령을 실행할 사용자 및 그룹
USER <user>[:<group>]
USER <UID>[:<GID>]
USER 2mukee:comeve
WORKDIR
: 작업 디렉터리 지정
: RUN cd와 다른 점은 이동하려는 디렉터리가 존재하지 않는 경우 생성하고 이동을 수행한다는점
WORKDIR /path/to/workdir
WORKDIR /home/2mukee
VOLUME
: 호스트에 마운트 시킬 컨테이너 내 디렉터리
: 컨테이너가 삭제되어도 보존할 데이터의 내부경로를 외부로 연결
: 기본적으로 호스트의 /var/lib/docker/volumes/{volume hash 값} 경로에 생성됨
: 호스트에서의 저장 경로를 변경하기 위해서는 docker run -v [호스트 경로]:[컨테이너 내 경로]로 실행해야함
VOLUME ["/data1", "/data2"]
VOLUME /var/lib/mysql
VOLUME vol1 vol2 # /vol1 /vol2와 동일
ONBUILD
: 다음에 빌드할 이미지에서 적용할 지시자를 지정
: 작성한 이미지가 다른 이미지의 베이스 이미지가 되어 빌드될 때 적용될 지시자를 의미
ONBUILD <INSTRUCTION>
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
STOPSIGNAL
: docker container stop 명령 등으로 docker 데몬이 컨테이너에게 보낼 시그널
: 기본적으로는 SIGTERM 시그널을 보내 정상적으로 종료될때까지 대기
: nginx를 통해 유닉스 소켓을 사용하면 컨테이너 중지 시 nginx가 중단되는 문제가 있어 SIGQUIT를 사용하는 것을 권장하기도 함
STOPSIGNAL signal
STOPSIGNAL SIGKILL
STOPSIGNAL 9
HEALTHCHECK
: 컨테이너에서 실행되는 프로세스의 상태를 체크
: 한 도커 파일 내에서 HEALTHCHECK가 여러 개 나올 경우 맨 마지막 줄의 명령만 유효 (한 번만 작성 가능)
HEALTHCHECK [OPTIONS] CMD command
# --interval=DURATION (default: 30s) 헬스체크 간격
# --timeout=DURATION (default: 30s) 타임아웃 시간
# --start-period=DURATION (default: 0s) 부트스트랩 시간이 필요한 컨테이너 초기화 시간 (해당 시간 동안은 실패해도 재시도 카운트에 포함하지 않음)
# --start-interval=DURATION (default: 5s) start-period 동안의 헬스체크 간격
# --retries=N (default: 3) 헬스체크 실패 시 최대 재시도 횟수
# 0: success 컨테이너가 정상인 상태
# 1: unhealthy 컨테이너가 올바르게 작동하지 않는 상태
# 2: reserved 예약된 코드
# docker container inspect 혹은 docker container ls로 확인가능
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://127.0.0.1/ || exit 1
SHELL
: 이미지 빌드 및 컨테이너 빌드 시의 기본 쉘 설정 (RUN / CMD / ENTRYPOINT 등)
: 기본 값은 /bin/sh
SHELL ["executable", "parameters"]
SHELL ["powershell", "-command"]
Reference
'Container > Docker' 카테고리의 다른 글
도커 컨테이너 이미지 빌드 시 --build-args 를 .env 파일로 부터 읽어오기 (0) | 2023.08.25 |
---|---|
도커 환경 변수 적용 방법 (0) | 2023.08.11 |
컨테이너와 도커에 대해 깊이 파헤쳐보자 (0) | 2023.06.22 |
failed to solve with frontend dockerfile.v0 failed to read dockerfile (0) | 2022.07.20 |
WSL 2.0 환경에서 Docker 설치 (0) | 2022.03.19 |