본문 바로가기
Back-end/Docker

Dockerfile 공식문서 정리 - 1

by whatamigonnabe 2023. 4. 17.

이 글은 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의 루트로서 스테이지 또는 이미지 이름을 형성

'Back-end > Docker' 카테고리의 다른 글

cAdvisor M1에 설치하기  (0) 2023.04.21
Dockerfile 공식문서 정리 2  (1) 2023.04.19