[번역]Dockerfile 레퍼런스 #1 > 서버관리자

서버관리자

서버관리자 모임 게시판 입니다.

[번역]Dockerfile 레퍼런스 #1 정보

[번역]Dockerfile 레퍼런스 #1

본문

Dockerfile reference

Docker 는 Dockerfile에서 지시 사항을 읽음으로써 이미지를 자동으로 빌드 할 수 있습니다. Dockerfile은 이미지를 어셈블하기 위해 사용자가 명령 행에서 호출 할 수있는 모든 명령을 포함하는 텍스트 문서입니다. docker build 사용자를 사용하면 여러 명령 줄 명령을 연속적으로 실행하는 자동화 된 빌드를 만들 수 있습니다.

이 페이지는 Dockerfile에서 사용할 수있는 명령을 설명합니다. 이 페이지를 읽었 으면 Dockerfile 모범 사례를 참조하여 팁 중심의 안내서를 찾으십시오.

Usage

docker build 명령은 Dockerfile 및 context에서 이미지를 빌드합니다. 빌드의 컨텍스트는 지정된 위치 PATH 또는 URL에 있는 파일 세트입니다. PATH는 로컬 파일 시스템의 디렉토리입니다. URL은 Git 저장소 위치입니다.

컨텍스트는 재귀 적으로 처리됩니다. 따라서 PATH에는 하위 디렉토리가 포함되고 URL에는 저장소 및 해당 하위 모듈이 포함됩니다. 이 예제는 현재 디렉토리를 컨텍스트로 사용하는 빌드 명령을 보여줍니다.

$ docker build .
Sending build context to Docker daemon  6.51 MB
...

빌드는 CLI 가 아닌 Docker 데몬에 의해 실행됩니다. 빌드 프로세스가 가장 먼저하는 일은 전체 컨텍스트를 재귀 적으로 데몬에 보내는 것입니다. 대부분의 경우 빈 디렉토리를 컨텍스트로 시작하고 Dockerfile 을 해당 디렉토리에 유지하는 것이 가장 좋습니다. Dockerfile 을 빌드하는 데 필요한 파일 만 추가하십시오.

경고 : 루트 디렉토리 /를 PATH로 사용하지 마십시오. 빌드로 인해 하드 드라이브의 전체 내용이 Docker 데몬으로 전송됩니다.

빌드 컨텍스트에서 파일을 사용하기 위해 Dockerfile은 명령에 지정된 파일 (예 : COPY 명령)을 참조합니다. 빌드 성능을 향상 시키려면 컨텍스트 디렉토리에 .dockerignore 파일을 추가하여 파일 및 디렉토리를 제외하십시오. .dockerignore 파일을 만드는 방법에 대한 자세한 내용은 이 페이지의 설명서를 참조하십시오.

전통적으로 Dockerfile은 Dockerfile이라고하며 컨텍스트의 루트에 있습니다. docker build와 함께 -f 플래그를 사용하면 파일 시스템의 어느 곳에서나 Dockerfile을 가리킬 수 있습니다.

$ docker build -f /path/to/a/Dockerfile .

빌드가 성공하면 새 이미지를 저장할 저장소 및 태그를 지정할 수 있습니다.

$ docker build -t shykes/myapp .

빌드 후 이미지를 여러 저장소에 태그하려면 build 명령을 실행할 때 여러 -t 매개 변수를 추가하십시오.

$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

Docker 데몬은 Dockerfile에서 지시 사항을 실행하기 전에 Dockerfile의 예비 유효성 검증을 수행하고 구문이 올바르지 않으면 오류를 리턴합니다.

$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

Docker 데몬은 Dockerfile에서 명령을 하나씩 실행하여 필요한 경우 새 이미지의 ID 를 출력하기 전에 각 명령의 결과를 새 이미지에 커밋합니다. Docker 데몬은 보낸 컨텍스트를 자동으로 정리합니다.

각 명령어는 독립적으로 실행되며 새 이미지가 만들어 지므로 RUN cd /tmp는 다음 명령어에 영향을 미치지 않습니다.

Docker 는 가능할 때마다 중간 이미지 (캐시)를 재사용하여 Docker build 프로세스를 크게 가속화합니다. 콘솔 출력에서 캐시 사용 메시지로 표시됩니다. (자세한 내용은 Dockerfile 모범 사례 안내서를 참조하십시오.

$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
 ---> 31f630c65071
Step 2/4 : MAINTAINER *** 개인정보보호를 위한 이메일주소 노출방지 ***
 ---> Using cache
 ---> 2a1c91448f5f
Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/
 ---> Using cache
 ---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
 ---> Using cache
 ---> 7ea8aef582cc
Successfully built 7ea8aef582cc

빌드 캐시는 로컬 상위 체인이있는 이미지에서만 사용됩니다. 이는 이러한 이미지가 이전 빌드에서 생성되었거나 전체 이미지 체인에 docker load가 로드되었음을 의미합니다. 특정 이미지의 빌드 캐시를 사용하려면 --cache-from 옵션으로 이미지를 지정할 수 있습니다. --cache-from으로 지정된 이미지에는 상위 체인이 필요하지 않으며 다른 레지스트리에서 가져올 수 있습니다.

빌드가 끝나면 저장소를 레지스트리에 푸시 할 준비가되었습니다.

BuildKit

버전 18.09 부터 Docker 는 moby/buildkit 프로젝트에서 제공하는 빌드 실행을 위한 새로운 백엔드를 지원합니다. BuildKit 백엔드는 이전 구현에 비해 많은 이점을 제공합니다. 예를 들어 BuildKit 은 다음을 수행 할 수 있습니다.

  • 사용하지 않는 빌드 단계 감지 및 건너 뛰기
  • 독립적인 구축 단계를 병렬화
  • 빌드 컨텍스트에서 빌드간에 변경된 파일 만 증분 전송
  • 빌드 컨텍스트에서 사용하지 않는 파일 전송 감지 및 건너 뛰기
  • 많은 새로운 기능으로 외부 Dockerfile 구현 사용
  • 나머지 API (중간 이미지 및 컨테이너)의 부작용 방지
  • 자동 정리를 위해 빌드 캐시 우선 순위 지정

BuildKit 백엔드를 사용하려면 docker build를 호출하기 전에 CLI 에서 환경 변수 DOCKER_BUILDKIT=1을 설정해야합니다.

BuildKit 기반 빌드에 사용 가능한 실험용 Dockerfile 구문에 대해 학습하려면 BuildKit 저장소의 문서를 참조하십시오.

Format

Dockerfile의 형식은 다음과 같습니다.

# Comment
INSTRUCTION arguments

명령은 대소 문자를 구분하지 않습니다. 그러나 관례는 그것들을보다 쉽게 인수와 구별하기 위해 대문자로 하는 것입니다.

Docker 는 Dockerfile에서 명령을 순서대로 실행합니다. Dockerfile은 FROM 명령으로 시작해야합니다. 이는 구문 분석기 지시문, 주석 및 글로벌 범위의 ARG 이후 일 수 있습니다. FROM 명령어는 사용자가 생성 한 부모 이미지를 지정합니다. FROM 앞에는 하나 이상의 ARG 명령어 만있을 수 있습니다. 이 명령어는 Dockerfile의 FROM 행에서 사용되는 인수를 선언합니다.

Docker 는 #로 시작하는 행을 주석으로 처리합니다 (행이 유효한 구문 분석기 지시문이 아닌 경우). 줄의 다른 곳에서 # 표시는 인수로 취급됩니다. 이를 통해 다음과 같은 진술이 가능합니다.

# Comment
RUN echo 'we are running some # of cool things'

주석에서 줄 연속 문자는 지원되지 않습니다.

Parser directives

파서 지시문은 선택 사항이며 Dockerfile의 후속 줄이 처리되는 방식에 영향을 미칩니다. 파서 지시문은 빌드에 레이어를 추가하지 않으며 빌드 단계로 표시되지 않습니다. 파서 지시문은 #directive=value 형식으로 특수한 유형의 주석으로 작성됩니다. 단일 지시문은 한 번만 사용할 수 있습니다.

주석, 빈 줄 또는 빌더 명령이 처리되면 Docker 는 더 이상 파서 지시문을 찾지 않습니다. 대신 파서 지시문으로 서식이 지정된 모든 것을 주석으로 처리하고 파서 지시문인지 여부를 확인하려고 시도하지 않습니다. 따라서 모든 파서 지시문은 Dockerfile의 맨 위에 있어야합니다.

파서 지시문은 대소 문자를 구분하지 않습니다. 그러나 관례는 그것들이 소문자 인 것입니다. 또한 협약은 파서 지시문 뒤에 빈 줄을 포함해야합니다. 행 연속 문자는 구문 분석기 지시문에서 지원되지 않습니다.

이러한 규칙으로 인해 다음 예제는 모두 유효하지 않습니다.

줄 연속으로 인해 유효하지 않습니다.

# direc \
tive=value

두 번 나타나기 때문에 유효하지 않습니다:

# directive=value1
# directive=value2

FROM ImageName

빌더 지시 후에 표시되어 주석으로 처리됩니다.

FROM ImageName
# directive=value

구문 분석기 지시문이 아닌 주석 뒤에 표시되어 주석으로 처리됩니다.

# About my dockerfile
# directive=value
FROM ImageName

알 수없는 지시문은 인식되지 않기 때문에 주석으로 처리됩니다. 또한 알려진 지시문은 구문 분석기 지시문이 아닌 주석 뒤에 표시되므로 주석으로 처리됩니다.

# unknowndirective=value
# knowndirective=value

파서 지시문에는 줄 바꿈이없는 공백이 허용됩니다. 따라서 다음 줄은 모두 동일하게 취급됩니다.

#directive=value
# directive =value
#	directive= value
# directive = value
#	  dIrEcTiVe=value

다음과 같은 파서 지시문이 지원됩니다.

  • syntax
  • escape

syntax

# syntax=[remote image reference]

예를 들면 다음과 같습니다.

# syntax=docker/dockerfile
# syntax=docker/dockerfile:1.0
# syntax=docker.io/docker/dockerfile:1
# syntax=docker/dockerfile:1.0.0-experimental
# syntax=example.com/user/repo:tag@sha256:abcdef...

이 기능은 BuildKit 백엔드가 사용되는 경우에만 활성화됩니다.

구문 지시문은 현재 Dockerfile 을 빌드하는 데 사용되는 Dockerfile 빌더의 위치를 정의합니다. BuildKit 백엔드는 Docker 이미지로 배포되고 컨테이너 샌드 박스 환경 내에서 실행되는 외부 빌더 구현을 원활하게 사용할 수 있습니다.

사용자 정의 Dockerfile 구현을 통해 다음을 수행 할 수 있습니다.

  • 데몬을 업데이트하지 않고 자동으로 버그 수정
  • Dockerfile 을 빌드하기 위해 모든 사용자가 동일한 구현을 사용하고 있는지 확인하십시오.
  • 데몬을 업데이트하지 않고 최신 기능을 사용하십시오
  • 새로운 실험 또는 타사 기능을 사용해보십시오

Official releases

Docker 는 Docker Hub 의 docker/dockerfile 저장소 아래에 Dockerfile을 빌드하는 데 사용할 수있는 공식 버전의 이미지를 배포합니다. 새로운 이미지가 출시되는 채널은 안정적이고 실험적입니다.

안정적인 채널은 시맨틱 버전 관리를 따릅니다. 예를 들면 다음과 같습니다.

  • docker/dockerfile:1.0.0 - only allow immutable version 1.0.0
  • docker/dockerfile:1.0 - allow versions 1.0.*
  • docker/dockerfile:1 - allow versions 1..
  • docker/dockerfile:latest - latest release on stable channel

실험 채널은 출시 시점에 안정적인 채널의 주요 및 부 구성 요소와 함께 증분 버전 관리를 사용합니다. 예를 들면 다음과 같습니다.

  • docker/dockerfile:1.0.1-experimental - only allow immutable version 1.0.1-experimental
  • docker/dockerfile:1.0-experimental - latest experimental releases after 1.0
  • docker/dockerfile:experimental - latest release on experimental channel

필요에 가장 적합한 채널을 선택해야합니다. 버그 수정 만 원한다면 docker/dockerfile : 1.0을 사용해야합니다. 실험 기능을 사용하려면 실험 채널을 사용해야합니다. 실험 채널을 사용하는 경우 최신 릴리스는 이전 버전과 호환되지 않을 수 있으므로 변경 불가능한 정식 버전 변형을 사용하는 것이 좋습니다.

마스터 빌드 및 야간 기능 릴리스에 대해서는 소스 저장소의 설명을 참조하십시오.

escape

# escape=\ (backslash)

또는

# escape=` (backtick)

escape 지시문은 Dockerfile에서 문자를 이스케이프하는 데 사용되는 문자를 설정합니다. 지정하지 않으면 기본 이스케이프 문자는 \입니다.

이스케이프 문자는 한 줄의 문자를 이스케이프하고 개행을 이스케이프하는 데 사용됩니다. 이를 통해 Dockerfile 명령어가 여러 줄에 걸쳐 있을 수 있습니다. 이스케이프 파서 지시문이 Dockerfile에 포함되는지 여부에 관계없이 줄 끝을 제외하고 RUN 명령에서 이스케이프가 수행되지 않습니다.

이스케이프 문자를 ``` 로 설정하면 Windows 에서 특히 유용합니다. 여기서 \는 디렉토리 경로 구분 기호입니다. Windows PowerShell` 과 일치합니다.

Windows 에서 명백하지 않은 방식으로 실패하는 다음 예제를 고려하십시오. 두 번째 줄의 끝에있는 두 번째 \는 첫 번째 줄에서 이스케이프하는 대상 대신 개행에 대한 이스케이프로 해석됩니다. 마찬가지로, 세 번째 줄 끝의 \는 실제로 명령으로 처리되었다고 가정 할 경우 줄 연속으로 취급됩니다. 이 dockerfile의 결과는 두 번째 및 세 번째 행이 단일 명령으로 간주됩니다.

FROM microsoft/nanoserver
COPY testfile.txt c:\\
RUN dir c:\

결과:

PS C:\John> docker build -t cmd .
Sending build context to Docker daemon 3.072 kB
Step 1/2 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/2 : COPY testfile.txt c:\RUN dir c:
GetFileAttributesEx c:RUN: The system cannot find the file specified.
PS C:\John>

위의 한 가지 해결책은 /를 COPY 명령과 dir의 대상으로 사용하는 것입니다. 그러나이 구문은 Windows의 경로에는 자연스럽지 않으므로 혼란스럽고 최악의 경우 Windows의 모든 명령이 경로 구분 기호를 지원하지는 않으므로 오류가 발생하기 쉽습니다.

이스케이프 파서 지시문을 추가하면 다음 Dockerfile이 Windows의 파일 경로에 자연 플랫폼 의미를 사용하여 예상대로 성공합니다.

# escape=`

FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\

결과:

PS C:\John> docker build -t succeeds --no-cache=true .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/3 : COPY testfile.txt c:\
 ---> 96655de338de
Removing intermediate container 4db9acbb1682
Step 3/3 : RUN dir c:\
 ---> Running in a2c157f842f5
 Volume in drive C has no label.
 Volume Serial Number is 7E6D-E0F7

 Directory of c:\

10/05/2016  05:04 PM             1,894 License.txt
10/05/2016  02:22 PM    <DIR>          Program Files
10/05/2016  02:14 PM    <DIR>          Program Files (x86)
10/28/2016  11:18 AM                62 testfile.txt
10/28/2016  11:20 AM    <DIR>          Users
10/28/2016  11:20 AM    <DIR>          Windows
           2 File(s)          1,956 bytes
           4 Dir(s)  21,259,096,064 bytes free
 ---> 01c7f3bef04f
Removing intermediate container a2c157f842f5
Successfully built 01c7f3bef04f
PS C:\John>

 

공감
0
  • 복사

댓글 3개

© SIRSOFT
현재 페이지 제일 처음으로