[번역]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개

구글 번역했습니다.

