Docker에 정식으로 통합된 BuildKit의buildctl 명령에서 Dockerfile을 사용하지 않고 용기 이미지를 구축합니다

11430 단어 GoDocker

안녕하십니까? 저는 포삼린입니다.일본어 설명이 많지 않기 때문에buildctl 명령을 설정하고dockerbuild를 사용하지 않고 용기 이미지를 구축하는 과정을 소개합니다.OS는 Mac OSX로 가정합니다.

BuildKit


BuildKit은 명령에서 이미지 레이어를 만드는 데 사용되는 도구 패키지입니다.Buildkit== 많은 경우 차세대 docker build라는 표현으로 설명하지만, Buildkit 자체와 Docker는 별개의 문제입니다.원래 Docker는 moby라는 OSS로 제작되었는데, 그 중의 moby/buildkit은 이미지 층을 만들 책임이 있습니다.따라서 Buildkit은 차세대 기능을 가진 구축 도구 패키지의 느낌을 준다. dockerbuild는 단지 그것을 이용하는 느낌일 뿐이라고 말한다.

기본 구성 요소


BuildKit 프로젝트 자체는 두 개의 주요 구성 요소로 구성되어 있습니다.데몬을 만드는 데는 buildkitd와buildctl이라는 CLI 도구가 있습니다.buildctl은buildkitd와의 명령행 통신을 간소화하는 데 사용됩니다.

buildctl 환경 구축


수호 프로그램을 만드는buildkitd와buildctl이라는 CLI 도구를 사용합니다.
전제 조건은 다음과 같다.jq 명령은 JSON 데이터를 가공하는 데 사용되는 명령입니다.없어도 괜찮지만 moby/buildkit의 README.MD도 사용하기 편하니까
$ go version
go version go1.12 darwin/amd64

$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

$ jq --version
jq-1.6

buildctl의 준비


일단buildctl 명령을 설치하세요.README.md의 방법이라면'이 OS는 실행할 수 없다'고 할 수 있으므로https://github.com/moby/buildkit/releases에서 OS에 맞는 바이너리를 직접 다운로드하는 것을 권장합니다.그런 다음 PATH 통과 디렉토리/usr/local/bin에 바이너리 파일을 배치합니다.

buildkitd의 준비


Docker 컨테이너에서buildkitd 데몬을 실행하고 원격으로 접근해서 BuildKit를 사용할 수도 있습니다.moby/buildkit에 Docker 이미지가 게시되었습니다.다음 명령을 실행하면 준비를 완료할 수 있습니다.
$ docker run --name buildkit -d --privileged -p 1234:1234 moby/buildkit --addr tcp://0.0.0.0:1234

$ export BUILDKIT_HOST=tcp://0.0.0.0:1234

$ buildctl build --help
이렇게 하면 나는 준비가 다 된다.

어쨌든 BuildKit을 만져보세요.


moby/buildkit/example 중 즉시 실행할 수 있는 예가 있다.examples/buildkit0/buildkit.go는 샘플 LLB를 표준 출력에 전달합니다.복제해서 실행합시다.
$ go run examples/buildkit0/buildkit.go | buildctl debug dump-llb | jq '.'
다음은 dump-llb JSON 출력의 발췌문입니다.
// ...
{
  "Op": {
    "inputs": [
      {
        "digest": "sha256:50cd8db1b5d8630e4fef4b359c215f2938d5052391a39e5126fc90174e694ceb",
        "index": 0
      }
    ],
    "Op": {
      "Exec": {
        "meta": {
          "args": [
            "git",
            "checkout",
            "-q",
            "6635b4f0c6af3810594d2770f662f34ddc15b40d"
          ],
          "env": [
            "PATH=/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "GOPATH=/go"
          ],
          "cwd": "/go/src/github.com/opencontainers/runc"
        },
        "mounts": [
          {
            "input": 0,
            "dest": "/",
            "output": 0
          }
        ]
      }
    },
    "platform": {
      "Architecture": "amd64",
      "OS": "linux"
    },
    "constraints": {}
  }
}
// ...
이게 뭐야?이 JSON은 DAG 구조를 가진 중간 언어 LLB를 나타냅니다.

LLB란 무엇입니까?



BuildKit는 LLB 프로세스의 종속 관계도를 정의하기 위해 바이너리 중간 언어를 사용합니다.이미지를 구축하는 중입니다.
이 중간 언어를 왜 끼워야 하는지 말하자면 LLB는 DAG 구조(위의 이미지와 같은 비순환 구조)를 채택함으로써 각 단계의 의존 관계를 해결하고 병행 실행 가능한 형식으로 기술할 수 있기 때문이다.이것은 BuildKit의 docker build를 사용하여 동시에 실행할 수 있도록 합니다.
Dockerfile 구축을 예로 들 수 있습니다.Dockerfile을 AST로 변환한 후 AST에서 스테이지로 해석된 구조를 생성한 다음 LLB로 변환합니다.

LLB를 사용하는 장점은 병행 실행 외에도 고속 캐시를 효율적으로 실현하거나 공급업체에 의존하지 않는 것(즉, Dockerfile을 제외한 언어를 쉽게 실현할 수 있는 것)을 포함한다.
그렇다면 구축 처리를 실제로 살펴보자.
go run examples/buildkit0/buildkit.go | buildctl build
buildctlbuild를 실행할 때 병렬 구축된 것을 볼 수 있습니다.구축 결과와 중간 캐시는 구축 Kit 내부에만 유지됩니다.
$ buildctl du
ID                                  RECLAIMABLE SIZE        LAST ACCESSED
sha256:07e99186a7474c586eab459d6375cc17298bad5f725f2205688e0e4c907d99f6 true        471.44MB

// ...
이러한 레이어를 Docker 이미지로 구체화하려면 구축 호출에서 --exporter 플래그를 사용합니다.캐시 구축을 통해 구축이 매우 빠른 것을 볼 수 있을 것입니다.
go run examples/buildkit0/buildkit.go | buildctl build --exporter=docker --exporter-opt name=buildkit0 | docker load
컨테이너 이미지가 Docker 이미지로 생성된 것을 볼 수 있습니다.
$ docker image ls
REPOSITORY   TAG     IMAGE ID      CREATED        SIZE
buildkit0    latest  8e063c66117d  2 hours ago    129MB
이렇게 되면 용기 이미지 생성의 절차는buildctl로 진행할 수 있다.example 코드로 뭘 해요? 한가할 때 보도해요.

참고 자료


빌드키트의 README.md가 가장 구체적이에요.
moby/buildkit
buildctl 시작 자료
Getting Started With BuildKit

기타 관련 기사


제가 쓴 Buildkit 주변 해설 기사도 봐주세요.
Docker 추상적 구문 트리의 구조를 빠르게 이해하는 Go 읽기
Buildkit Go의 코드를 읽고 Dockerfile 추상적인 문법 트리가 LLB를 생성하는 과정을 보세요!!

좋은 웹페이지 즐겨찾기