Merge branch 'master' into patch-1
commit
576b9caaa2
@ -0,0 +1,185 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REPO_SLUG_ORIGIN: "moby/buildkit:master"
|
||||||
|
CACHEKEY_BINARIES: "binaries"
|
||||||
|
PLATFORMS: "linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
base:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Build ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
run: |
|
||||||
|
./hack/build_ci_first_pass binaries
|
||||||
|
env:
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
CACHEDIR_TO: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}-new
|
||||||
|
-
|
||||||
|
# FIXME: Temp fix for https://github.com/moby/buildkit/issues/1850
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
mv /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}-new /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [base]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
run: |
|
||||||
|
make test
|
||||||
|
env:
|
||||||
|
TEST_COVERAGE: 1
|
||||||
|
TESTFLAGS: -v --parallel=6 --timeout=20m
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
-
|
||||||
|
name: Send to Codecov
|
||||||
|
uses: codecov/codecov-action@v1
|
||||||
|
with:
|
||||||
|
file: ./coverage/coverage.txt
|
||||||
|
|
||||||
|
cross:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [base]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Cross
|
||||||
|
run: |
|
||||||
|
make cross
|
||||||
|
env:
|
||||||
|
TARGETPLATFORM: ${{ env.PLATFORMS }},darwin/amd64,darwin/arm64,windows/amd64
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
|
||||||
|
binaries:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [test, cross]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Prepare
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
TAG=pr
|
||||||
|
if [[ $GITHUB_REF == refs/tags/v* ]]; then
|
||||||
|
TAG=${GITHUB_REF#refs/tags/}
|
||||||
|
elif [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||||
|
TAG=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
|
||||||
|
fi
|
||||||
|
echo ::set-output name=tag::${TAG}
|
||||||
|
-
|
||||||
|
name: Cache ${{ env.CACHEKEY_BINARIES }}
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
key: ${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-${{ github.sha }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-buildx-${{ env.CACHEKEY_BINARIES }}-
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Build ${{ steps.prep.outputs.tag }}
|
||||||
|
run: |
|
||||||
|
./hack/release "${{ steps.prep.outputs.tag }}" release-out
|
||||||
|
env:
|
||||||
|
PLATFORMS: ${{ env.PLATFORMS }},darwin/amd64,darwin/arm64,windows/amd64
|
||||||
|
CACHEDIR_FROM: /tmp/.buildx-cache/${{ env.CACHEKEY_BINARIES }}
|
||||||
|
-
|
||||||
|
name: Move artifacts
|
||||||
|
run: |
|
||||||
|
mv ./release-out/**/* ./release-out/
|
||||||
|
-
|
||||||
|
name: Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: buildx
|
||||||
|
path: ./release-out/*
|
||||||
|
if-no-files-found: error
|
||||||
|
-
|
||||||
|
name: GitHub Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
draft: true
|
||||||
|
files: ./release-out/*
|
||||||
|
name: ${{ steps.prep.outputs.tag }}
|
@ -0,0 +1,25 @@
|
|||||||
|
# Workflow used to make a request to proxy.golang.org to refresh cache on https://pkg.go.dev/github.com/docker/buildx
|
||||||
|
# when a released of buildx is produced
|
||||||
|
name: godev
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Set up Go
|
||||||
|
uses: actions/setup-go@v2
|
||||||
|
with:
|
||||||
|
go-version: 1.13
|
||||||
|
-
|
||||||
|
name: Call pkg.go.dev
|
||||||
|
run: |
|
||||||
|
go get github.com/${GITHUB_REPOSITORY}@${GITHUB_REF#refs/tags/}
|
||||||
|
env:
|
||||||
|
GO111MODULE: on
|
||||||
|
GOPROXY: https://proxy.golang.org
|
@ -0,0 +1,39 @@
|
|||||||
|
name: validate
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REPO_SLUG_ORIGIN: "moby/buildkit:master"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
target:
|
||||||
|
- lint
|
||||||
|
- validate-vendor
|
||||||
|
- validate-docs
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
driver-opts: image=${{ env.REPO_SLUG_ORIGIN }}
|
||||||
|
-
|
||||||
|
name: Run
|
||||||
|
run: |
|
||||||
|
make ${{ matrix.target }}
|
@ -1,2 +1,3 @@
|
|||||||
bin
|
bin
|
||||||
cross-out
|
coverage
|
||||||
|
cross-out
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
run:
|
||||||
|
timeout: 10m
|
||||||
|
skip-files:
|
||||||
|
- ".*\\.pb\\.go$"
|
||||||
|
|
||||||
|
modules-download-mode: vendor
|
||||||
|
|
||||||
|
build-tags:
|
||||||
|
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- gofmt
|
||||||
|
- govet
|
||||||
|
- deadcode
|
||||||
|
- goimports
|
||||||
|
- ineffassign
|
||||||
|
- misspell
|
||||||
|
- unused
|
||||||
|
- varcheck
|
||||||
|
- golint
|
||||||
|
- staticcheck
|
||||||
|
- typecheck
|
||||||
|
- structcheck
|
||||||
|
disable-all: true
|
||||||
|
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- linters:
|
||||||
|
- golint
|
||||||
|
text: "stutters"
|
@ -1,35 +0,0 @@
|
|||||||
dist: bionic
|
|
||||||
sudo: required
|
|
||||||
|
|
||||||
install:
|
|
||||||
- docker run --name buildkit --rm -d --privileged -p 1234:1234 $REPO_SLUG_ORIGIN --addr tcp://0.0.0.0:1234
|
|
||||||
- sudo docker cp buildkit:/usr/bin/buildctl /usr/bin/
|
|
||||||
- export BUILDKIT_HOST=tcp://0.0.0.0:1234
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- PLATFORMS="linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le"
|
|
||||||
- CROSS_PLATFORMS="${PLATFORMS},darwin/amd64,windows/amd64"
|
|
||||||
- PREFER_BUILDCTL="1"
|
|
||||||
|
|
||||||
script:
|
|
||||||
- make binaries validate-all && TARGETPLATFORM="${CROSS_PLATFORMS}" ./hack/cross
|
|
||||||
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
- provider: script
|
|
||||||
script: PLATFORMS="${CROSS_PLATFORMS}" ./hack/release $TRAVIS_TAG release-out
|
|
||||||
on:
|
|
||||||
repo: docker/buildx
|
|
||||||
tags: true
|
|
||||||
condition: $TRAVIS_TAG =~ ^v[0-9]
|
|
||||||
- provider: releases
|
|
||||||
api_key:
|
|
||||||
secure: "VKVL+tyS3BfqjM4VMGHoHJbcKY4mqq4AGrclVEvBnt0gm1LkGeKxSheCZgF1EC4oSV8rCy6dkoRWL0PLkl895MIl20Z4v53o1NOQ4Fn0A+eptnrld8jYUkL5PcD+kdEqv2GkBn7vO6E/fwYY/wH9FYlE+fXUa0c/YQGqNGS+XVDtgkftqBV+F2EzaIwk+D+QClFBRmKvIbXrUQASi1K6K2eT3gvzR4zh679TSdI2nbnTKtE06xG1PBFVmb1Ux3/Jz4yHFvf2d3M1mOyqIBsozKoyxisiFQxnm3FjhPrdlZJ9oy/nsQM3ahQKJ3DF8hiLI1LxcxRa6wo//t3uu2eJSYl/c5nu0T7gVw4sChQNy52fUhEGoDTDwYoAxsLSDXcpj1jevRsKvxt/dh2e2De1a9HYj5oM+z2O+pcyiY98cKDbhe2miUqUdiYMBy24xUunB46zVcJF3pIqCYtw5ts8ES6Ixn3u+4OGV/hMDrVdiG2bOZtNVkdbKMEkOEBGa3parPJ69jh6og639kdAD3DFxyZn3YKYuJlcNShn3tj6iPokBYhlLwwf8vuEV7gK7G0rDS9yxuF03jgkwpBBF2wy+u1AbJv241T7v2ZB8H8VlYyHA0E5pnoWbw+lIOTy4IAc8gIesMvDuFFi4r1okhiAt/24U0p4aAohjh1nPuU3spY="
|
|
||||||
file: release-out/**/*
|
|
||||||
skip_cleanup: true
|
|
||||||
file_glob: true
|
|
||||||
on:
|
|
||||||
repo: docker/buildx
|
|
||||||
tags: true
|
|
||||||
condition: $TRAVIS_TAG =~ ^v[0-9]
|
|
@ -0,0 +1,13 @@
|
|||||||
|
ignore: |
|
||||||
|
/vendor
|
||||||
|
|
||||||
|
extends: default
|
||||||
|
|
||||||
|
yaml-files:
|
||||||
|
- '*.yaml'
|
||||||
|
- '*.yml'
|
||||||
|
|
||||||
|
rules:
|
||||||
|
truthy: disable
|
||||||
|
line-length: disable
|
||||||
|
document-start: disable
|
@ -0,0 +1,236 @@
|
|||||||
|
package bake
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/build"
|
||||||
|
"github.com/docker/buildx/driver"
|
||||||
|
"github.com/docker/buildx/util/progress"
|
||||||
|
"github.com/moby/buildkit/client"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
|
gwclient "github.com/moby/buildkit/frontend/gateway/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Input struct {
|
||||||
|
State *llb.State
|
||||||
|
URL string
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadRemoteFiles(ctx context.Context, dis []build.DriverInfo, url string, names []string, pw progress.Writer) ([]File, *Input, error) {
|
||||||
|
st, filename, ok := detectHTTPContext(url)
|
||||||
|
if !ok {
|
||||||
|
st, ok = detectGitContext(url)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, errors.Errorf("not url context")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inp := &Input{State: st, URL: url}
|
||||||
|
var files []File
|
||||||
|
|
||||||
|
var di *build.DriverInfo
|
||||||
|
for _, d := range dis {
|
||||||
|
if d.Err == nil {
|
||||||
|
di = &d
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if di == nil {
|
||||||
|
return nil, nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c, err := driver.Boot(ctx, di.Driver, pw)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ch, done := progress.NewChannel(pw)
|
||||||
|
defer func() { <-done }()
|
||||||
|
_, err = c.Build(ctx, client.SolveOpt{}, "buildx", func(ctx context.Context, c gwclient.Client) (*gwclient.Result, error) {
|
||||||
|
def, err := st.Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if filename != "" {
|
||||||
|
files, err = filesFromURLRef(ctx, c, ref, inp, filename, names)
|
||||||
|
} else {
|
||||||
|
files, err = filesFromRef(ctx, ref, names)
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}, ch)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, inp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsRemoteURL(url string) bool {
|
||||||
|
if _, _, ok := detectHTTPContext(url); ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if _, ok := detectGitContext(url); ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectHTTPContext(url string) (*llb.State, string, bool) {
|
||||||
|
if httpPrefix.MatchString(url) {
|
||||||
|
httpContext := llb.HTTP(url, llb.Filename("context"), llb.WithCustomName("[internal] load remote build context"))
|
||||||
|
return &httpContext, "context", true
|
||||||
|
}
|
||||||
|
return nil, "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectGitContext(ref string) (*llb.State, bool) {
|
||||||
|
found := false
|
||||||
|
if httpPrefix.MatchString(ref) && gitURLPathWithFragmentSuffix.MatchString(ref) {
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, prefix := range []string{"git://", "github.com/", "git@"} {
|
||||||
|
if strings.HasPrefix(ref, prefix) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.SplitN(ref, "#", 2)
|
||||||
|
branch := ""
|
||||||
|
if len(parts) > 1 {
|
||||||
|
branch = parts[1]
|
||||||
|
}
|
||||||
|
gitOpts := []llb.GitOption{llb.WithCustomName("[internal] load git source " + ref)}
|
||||||
|
|
||||||
|
st := llb.Git(parts[0], branch, gitOpts...)
|
||||||
|
return &st, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func isArchive(header []byte) bool {
|
||||||
|
for _, m := range [][]byte{
|
||||||
|
{0x42, 0x5A, 0x68}, // bzip2
|
||||||
|
{0x1F, 0x8B, 0x08}, // gzip
|
||||||
|
{0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00}, // xz
|
||||||
|
} {
|
||||||
|
if len(header) < len(m) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if bytes.Equal(m, header[:len(m)]) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r := tar.NewReader(bytes.NewBuffer(header))
|
||||||
|
_, err := r.Next()
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filesFromURLRef(ctx context.Context, c gwclient.Client, ref gwclient.Reference, inp *Input, filename string, names []string) ([]File, error) {
|
||||||
|
stat, err := ref.StatFile(ctx, gwclient.StatRequest{Path: filename})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: filename,
|
||||||
|
Range: &gwclient.FileRange{
|
||||||
|
Length: 1024,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if isArchive(dt) {
|
||||||
|
bc := llb.Scratch().File(llb.Copy(inp.State, filename, "/", &llb.CopyInfo{
|
||||||
|
AttemptUnpack: true,
|
||||||
|
}))
|
||||||
|
inp.State = &bc
|
||||||
|
inp.URL = ""
|
||||||
|
def, err := bc.Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return filesFromRef(ctx, ref, names)
|
||||||
|
}
|
||||||
|
|
||||||
|
inp.State = nil
|
||||||
|
name := inp.URL
|
||||||
|
inp.URL = ""
|
||||||
|
|
||||||
|
if len(dt) > stat.Size() {
|
||||||
|
if stat.Size() > 1024*512 {
|
||||||
|
return nil, errors.Errorf("non-archive definition URL bigger than maximum allowed size")
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err = ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: filename,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return []File{{Name: name, Data: dt}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func filesFromRef(ctx context.Context, ref gwclient.Reference, names []string) ([]File, error) {
|
||||||
|
// TODO: auto-remove parent dir in needed
|
||||||
|
var files []File
|
||||||
|
|
||||||
|
isDefault := false
|
||||||
|
if len(names) == 0 {
|
||||||
|
isDefault = true
|
||||||
|
names = defaultFilenames()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range names {
|
||||||
|
_, err := ref.StatFile(ctx, gwclient.StatRequest{Path: name})
|
||||||
|
if err != nil {
|
||||||
|
if isDefault {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{Filename: name})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
files = append(files, File{Name: name, Data: dt})
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package build
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io/ioutil"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/driver"
|
||||||
|
"github.com/docker/buildx/util/progress"
|
||||||
|
"github.com/moby/buildkit/client"
|
||||||
|
"github.com/moby/buildkit/client/llb"
|
||||||
|
gwclient "github.com/moby/buildkit/frontend/gateway/client"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createTempDockerfileFromURL(ctx context.Context, d driver.Driver, url string, pw progress.Writer) (string, error) {
|
||||||
|
c, err := driver.Boot(ctx, d, pw)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
var out string
|
||||||
|
ch, done := progress.NewChannel(pw)
|
||||||
|
defer func() { <-done }()
|
||||||
|
_, err = c.Build(ctx, client.SolveOpt{}, "buildx", func(ctx context.Context, c gwclient.Client) (*gwclient.Result, error) {
|
||||||
|
def, err := llb.HTTP(url, llb.Filename("Dockerfile"), llb.WithCustomNamef("[internal] load %s", url)).Marshal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := c.Solve(ctx, gwclient.SolveRequest{
|
||||||
|
Definition: def.ToPB(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ref, err := res.SingleRef()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
stat, err := ref.StatFile(ctx, gwclient.StatRequest{
|
||||||
|
Path: "Dockerfile",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if stat.Size() > 512*1024 {
|
||||||
|
return nil, errors.Errorf("Dockerfile %s bigger than allowed max size", url)
|
||||||
|
}
|
||||||
|
|
||||||
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{
|
||||||
|
Filename: "Dockerfile",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
dir, err := ioutil.TempDir("", "buildx")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, "Dockerfile"), dt, 0600); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
out = dir
|
||||||
|
return nil, nil
|
||||||
|
}, ch)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
comment: false
|
@ -0,0 +1,198 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/docker/buildx/commands"
|
||||||
|
"github.com/docker/cli/cli/command"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/pflag"
|
||||||
|
)
|
||||||
|
|
||||||
|
const descriptionSourcePath = "docs/reference/"
|
||||||
|
|
||||||
|
func generateDocs(opts *options) error {
|
||||||
|
dockerCLI, err := command.NewDockerCli()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "docker [OPTIONS] COMMAND [ARG...]",
|
||||||
|
Short: "The base command for the Docker CLI.",
|
||||||
|
}
|
||||||
|
cmd.AddCommand(commands.NewRootCmd("buildx", true, dockerCLI))
|
||||||
|
return genCmd(cmd, opts.target)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getMDFilename(cmd *cobra.Command) string {
|
||||||
|
name := cmd.CommandPath()
|
||||||
|
if i := strings.Index(name, " "); i >= 0 {
|
||||||
|
name = name[i+1:]
|
||||||
|
}
|
||||||
|
return strings.ReplaceAll(name, " ", "_") + ".md"
|
||||||
|
}
|
||||||
|
|
||||||
|
func genCmd(cmd *cobra.Command, dir string) error {
|
||||||
|
for _, c := range cmd.Commands() {
|
||||||
|
if err := genCmd(c, dir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !cmd.HasParent() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
mdFile := getMDFilename(cmd)
|
||||||
|
fullPath := filepath.Join(dir, mdFile)
|
||||||
|
|
||||||
|
content, err := ioutil.ReadFile(fullPath)
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
return errors.Wrapf(err, "%s does not exist", mdFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cs := string(content)
|
||||||
|
|
||||||
|
markerStart := "<!---MARKER_GEN_START-->"
|
||||||
|
markerEnd := "<!---MARKER_GEN_END-->"
|
||||||
|
|
||||||
|
start := strings.Index(cs, markerStart)
|
||||||
|
end := strings.Index(cs, markerEnd)
|
||||||
|
|
||||||
|
if start == -1 {
|
||||||
|
return errors.Errorf("no start marker in %s", mdFile)
|
||||||
|
}
|
||||||
|
if end == -1 {
|
||||||
|
return errors.Errorf("no end marker in %s", mdFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := cmdOutput(cmd, cs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cont := cs[:start] + markerStart + "\n" + out + "\n" + cs[end:]
|
||||||
|
|
||||||
|
fi, err := os.Stat(fullPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(fullPath, []byte(cont), fi.Mode()); err != nil {
|
||||||
|
return errors.Wrapf(err, "failed to write %s", fullPath)
|
||||||
|
}
|
||||||
|
log.Printf("updated %s", fullPath)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeLink(txt, link string, f *pflag.Flag, isAnchor bool) string {
|
||||||
|
link = "#" + link
|
||||||
|
annotations, ok := f.Annotations["docs.external.url"]
|
||||||
|
if ok && len(annotations) > 0 {
|
||||||
|
link = annotations[0]
|
||||||
|
} else {
|
||||||
|
if !isAnchor {
|
||||||
|
return txt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[" + txt + "](" + link + ")"
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmdOutput(cmd *cobra.Command, old string) (string, error) {
|
||||||
|
b := &strings.Builder{}
|
||||||
|
|
||||||
|
desc := cmd.Short
|
||||||
|
if cmd.Long != "" {
|
||||||
|
desc = cmd.Long
|
||||||
|
}
|
||||||
|
if desc != "" {
|
||||||
|
fmt.Fprintf(b, "%s\n\n", desc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cmd.Aliases) != 0 {
|
||||||
|
fmt.Fprintf(b, "### Aliases\n\n`%s`", cmd.Name())
|
||||||
|
for _, a := range cmd.Aliases {
|
||||||
|
fmt.Fprintf(b, ", `%s`", a)
|
||||||
|
}
|
||||||
|
fmt.Fprint(b, "\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cmd.Commands()) != 0 {
|
||||||
|
fmt.Fprint(b, "### Subcommands\n\n")
|
||||||
|
fmt.Fprint(b, "| Name | Description |\n")
|
||||||
|
fmt.Fprint(b, "| --- | --- |\n")
|
||||||
|
for _, c := range cmd.Commands() {
|
||||||
|
fmt.Fprintf(b, "| [`%s`](%s) | %s |\n", c.Name(), getMDFilename(c), c.Short)
|
||||||
|
}
|
||||||
|
fmt.Fprint(b, "\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
hasFlags := cmd.Flags().HasAvailableFlags()
|
||||||
|
|
||||||
|
cmd.Flags().AddFlagSet(cmd.InheritedFlags())
|
||||||
|
|
||||||
|
if hasFlags {
|
||||||
|
fmt.Fprint(b, "### Options\n\n")
|
||||||
|
fmt.Fprint(b, "| Name | Description |\n")
|
||||||
|
fmt.Fprint(b, "| --- | --- |\n")
|
||||||
|
|
||||||
|
cmd.Flags().VisitAll(func(f *pflag.Flag) {
|
||||||
|
if f.Hidden {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isLink := strings.Contains(old, "<a name=\""+f.Name+"\"></a>")
|
||||||
|
fmt.Fprint(b, "| ")
|
||||||
|
if f.Shorthand != "" {
|
||||||
|
name := "`-" + f.Shorthand + "`"
|
||||||
|
name = makeLink(name, f.Name, f, isLink)
|
||||||
|
fmt.Fprintf(b, "%s, ", name)
|
||||||
|
}
|
||||||
|
name := "`--" + f.Name
|
||||||
|
if f.Value.Type() != "bool" {
|
||||||
|
name += " " + f.Value.Type()
|
||||||
|
}
|
||||||
|
name += "`"
|
||||||
|
name = makeLink(name, f.Name, f, isLink)
|
||||||
|
fmt.Fprintf(b, "%s | %s |\n", name, f.Usage)
|
||||||
|
})
|
||||||
|
fmt.Fprintln(b, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
return b.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type options struct {
|
||||||
|
target string
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseArgs() (*options, error) {
|
||||||
|
opts := &options{}
|
||||||
|
flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)
|
||||||
|
flags.StringVar(&opts.target, "target", descriptionSourcePath, "Docs directory")
|
||||||
|
err := flags.Parse(os.Args[1:])
|
||||||
|
return opts, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if err := run(); err != nil {
|
||||||
|
log.Printf("error: %+v", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func run() error {
|
||||||
|
opts, err := parseArgs()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := generateDocs(opts); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
# buildx
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx [OPTIONS] COMMAND
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Build with BuildKit
|
||||||
|
|
||||||
|
### Subcommands
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| [`bake`](buildx_bake.md) | Build from a file |
|
||||||
|
| [`build`](buildx_build.md) | Start a build |
|
||||||
|
| [`create`](buildx_create.md) | Create a new builder instance |
|
||||||
|
| [`du`](buildx_du.md) | Disk usage |
|
||||||
|
| [`imagetools`](buildx_imagetools.md) | Commands to work on images in registry |
|
||||||
|
| [`inspect`](buildx_inspect.md) | Inspect current builder instance |
|
||||||
|
| [`install`](buildx_install.md) | Install buildx as a 'docker builder' alias |
|
||||||
|
| [`ls`](buildx_ls.md) | List builder instances |
|
||||||
|
| [`prune`](buildx_prune.md) | Remove build cache |
|
||||||
|
| [`rm`](buildx_rm.md) | Remove a builder instance |
|
||||||
|
| [`stop`](buildx_stop.md) | Stop builder instance |
|
||||||
|
| [`uninstall`](buildx_uninstall.md) | Uninstall the 'docker builder' alias |
|
||||||
|
| [`use`](buildx_use.md) | Set the current builder instance |
|
||||||
|
| [`version`](buildx_version.md) | Show buildx version information |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
@ -0,0 +1,373 @@
|
|||||||
|
# buildx bake
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx bake [OPTIONS] [TARGET...]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Build from a file
|
||||||
|
|
||||||
|
### Aliases
|
||||||
|
|
||||||
|
`bake`, `f`
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| [`-f`](#file), [`--file stringArray`](#file) | Build definition file |
|
||||||
|
| `--load` | Shorthand for --set=*.output=type=docker |
|
||||||
|
| [`--no-cache`](#no-cache) | Do not use cache when building the image |
|
||||||
|
| [`--print`](#print) | Print the options without building |
|
||||||
|
| [`--progress string`](#progress) | Set type of progress output (auto, plain, tty). Use plain to show container output |
|
||||||
|
| [`--pull`](#pull) | Always attempt to pull a newer version of the image |
|
||||||
|
| `--push` | Shorthand for --set=*.output=type=registry |
|
||||||
|
| [`--set stringArray`](#set) | Override target value (eg: targetpattern.key=value) |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Bake is a high-level build command. Each specified target will run in parallel
|
||||||
|
as part of the build.
|
||||||
|
|
||||||
|
Read [High-level build options](https://github.com/docker/buildx#high-level-build-options) for introduction.
|
||||||
|
|
||||||
|
Please note that `buildx bake` command may receive backwards incompatible features in the future if needed. We are looking for feedback on improving the command and extending the functionality further.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### <a name="file"></a> Specify a build definition file (-f, --file)
|
||||||
|
|
||||||
|
By default, `buildx bake` looks for build definition files in the current directory,
|
||||||
|
the following are parsed:
|
||||||
|
|
||||||
|
- `docker-compose.yml`
|
||||||
|
- `docker-compose.yaml`
|
||||||
|
- `docker-bake.json`
|
||||||
|
- `docker-bake.override.json`
|
||||||
|
- `docker-bake.hcl`
|
||||||
|
- `docker-bake.override.hcl`
|
||||||
|
|
||||||
|
Use the `-f` / `--file` option to specify the build definition file to use. The
|
||||||
|
file can be a Docker Compose, JSON or HCL file. If multiple files are specified
|
||||||
|
they are all read and configurations are combined.
|
||||||
|
|
||||||
|
The following example uses a Docker Compose file named `docker-compose.dev.yaml`
|
||||||
|
as build definition file, and builds all targets in the file:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx bake -f docker-compose.dev.yaml
|
||||||
|
|
||||||
|
[+] Building 66.3s (30/30) FINISHED
|
||||||
|
=> [frontend internal] load build definition from Dockerfile 0.1s
|
||||||
|
=> => transferring dockerfile: 36B 0.0s
|
||||||
|
=> [backend internal] load build definition from Dockerfile 0.2s
|
||||||
|
=> => transferring dockerfile: 3.73kB 0.0s
|
||||||
|
=> [database internal] load build definition from Dockerfile 0.1s
|
||||||
|
=> => transferring dockerfile: 5.77kB 0.0s
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Pass the names of the targets to build, to build only specific target(s). The
|
||||||
|
following example builds the `backend` and `database` targets that are defined
|
||||||
|
in the `docker-compose.dev.yaml` file, skipping the build for the `frontend`
|
||||||
|
target:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx bake -f docker-compose.dev.yaml backend database
|
||||||
|
|
||||||
|
[+] Building 2.4s (13/13) FINISHED
|
||||||
|
=> [backend internal] load build definition from Dockerfile 0.1s
|
||||||
|
=> => transferring dockerfile: 81B 0.0s
|
||||||
|
=> [database internal] load build definition from Dockerfile 0.2s
|
||||||
|
=> => transferring dockerfile: 36B 0.0s
|
||||||
|
=> [backend internal] load .dockerignore 0.3s
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="no-cache"></a> Do not use cache when building the image (--no-cache)
|
||||||
|
|
||||||
|
Same as `build --no-cache`. Do not use cache when building the image.
|
||||||
|
|
||||||
|
### <a name="print"></a> Print the options without building (--print)
|
||||||
|
|
||||||
|
Prints the resulting options of the targets desired to be built, in a JSON format,
|
||||||
|
without starting a build.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx bake -f docker-bake.hcl --print db
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"db": {
|
||||||
|
"context": "./",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"tags": [
|
||||||
|
"docker.io/tiborvass/db"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="progress"></a> Set type of progress output (--progress)
|
||||||
|
|
||||||
|
Same as `build --progress`. Set type of progress output (auto, plain, tty). Use
|
||||||
|
plain to show container output (default "auto").
|
||||||
|
|
||||||
|
The following example uses `plain` output during the build:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx bake --progress=plain
|
||||||
|
|
||||||
|
#2 [backend internal] load build definition from Dockerfile.test
|
||||||
|
#2 sha256:de70cb0bb6ed8044f7b9b1b53b67f624e2ccfb93d96bb48b70c1fba562489618
|
||||||
|
#2 ...
|
||||||
|
|
||||||
|
#1 [database internal] load build definition from Dockerfile.test
|
||||||
|
#1 sha256:453cb50abd941762900a1212657a35fc4aad107f5d180b0ee9d93d6b74481bce
|
||||||
|
#1 transferring dockerfile: 36B done
|
||||||
|
#1 DONE 0.1s
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="pull"></a> Always attempt to pull a newer version of the image (--pull)
|
||||||
|
|
||||||
|
Same as `build --pull`.
|
||||||
|
|
||||||
|
### <a name="set"></a> Override target configurations from command line (--set)
|
||||||
|
|
||||||
|
```
|
||||||
|
--set targetpattern.key[.subkey]=value
|
||||||
|
```
|
||||||
|
|
||||||
|
Override target configurations from command line. The pattern matching syntax is
|
||||||
|
defined in https://golang.org/pkg/path/#Match.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx bake --set target.args.mybuildarg=value
|
||||||
|
$ docker buildx bake --set target.platform=linux/arm64
|
||||||
|
$ docker buildx bake --set foo*.args.mybuildarg=value # overrides build arg for all targets starting with 'foo'
|
||||||
|
$ docker buildx bake --set *.platform=linux/arm64 # overrides platform for all targets
|
||||||
|
$ docker buildx bake --set foo*.no-cache # bypass caching only for targets starting with 'foo'
|
||||||
|
```
|
||||||
|
|
||||||
|
Complete list of overridable fields:
|
||||||
|
args, cache-from, cache-to, context, dockerfile, labels, no-cache, output, platform,
|
||||||
|
pull, secrets, ssh, tags, target
|
||||||
|
|
||||||
|
### File definition
|
||||||
|
|
||||||
|
In addition to compose files, bake supports a JSON and an equivalent HCL file
|
||||||
|
format for defining build groups and targets.
|
||||||
|
|
||||||
|
A target reflects a single docker build invocation with the same options that
|
||||||
|
you would specify for `docker build`. A group is a grouping of targets.
|
||||||
|
|
||||||
|
Multiple files can include the same target and final build options will be
|
||||||
|
determined by merging them together.
|
||||||
|
|
||||||
|
In the case of compose files, each service corresponds to a target.
|
||||||
|
|
||||||
|
A group can specify its list of targets with the `targets` option. A target can
|
||||||
|
inherit build options by setting the `inherits` option to the list of targets or
|
||||||
|
groups to inherit from.
|
||||||
|
|
||||||
|
Note: Design of bake command is work in progress, the user experience may change
|
||||||
|
based on feedback.
|
||||||
|
|
||||||
|
|
||||||
|
**Example HCL definition**
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
group "default" {
|
||||||
|
targets = ["db", "webapp-dev"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp-dev" {
|
||||||
|
dockerfile = "Dockerfile.webapp"
|
||||||
|
tags = ["docker.io/username/webapp"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp-release" {
|
||||||
|
inherits = ["webapp-dev"]
|
||||||
|
platforms = ["linux/amd64", "linux/arm64"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "db" {
|
||||||
|
dockerfile = "Dockerfile.db"
|
||||||
|
tags = ["docker.io/username/db"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Complete list of valid target fields:
|
||||||
|
|
||||||
|
`args`, `cache-from`, `cache-to`, `context`, `dockerfile`, `inherits`, `labels`,
|
||||||
|
`no-cache`, `output`, `platform`, `pull`, `secrets`, `ssh`, `tags`, `target`
|
||||||
|
|
||||||
|
### HCL variables and functions
|
||||||
|
|
||||||
|
Similar to how Terraform provides a way to [define variables](https://www.terraform.io/docs/configuration/variables.html#declaring-an-input-variable),
|
||||||
|
the HCL file format also supports variable block definitions. These can be used
|
||||||
|
to define variables with values provided by the current environment, or a default
|
||||||
|
value when unset.
|
||||||
|
|
||||||
|
|
||||||
|
Example of using interpolation to tag an image with the git sha:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cat <<'EOF' > docker-bake.hcl
|
||||||
|
variable "TAG" {
|
||||||
|
default = "latest"
|
||||||
|
}
|
||||||
|
|
||||||
|
group "default" {
|
||||||
|
targets = ["webapp"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp" {
|
||||||
|
tags = ["docker.io/username/webapp:${TAG}"]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"tags": [
|
||||||
|
"docker.io/username/webapp:latest"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ TAG=$(git rev-parse --short HEAD) docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"tags": [
|
||||||
|
"docker.io/username/webapp:985e9e9"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
A [set of generally useful functions](https://github.com/docker/buildx/blob/master/bake/hcl.go#L19-L65)
|
||||||
|
provided by [go-cty](https://github.com/zclconf/go-cty/tree/main/cty/function/stdlib)
|
||||||
|
are available for use in HCL files. In addition, [user defined functions](https://github.com/hashicorp/hcl/tree/main/ext/userfunc)
|
||||||
|
are also supported.
|
||||||
|
|
||||||
|
Example of using the `add` function:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cat <<'EOF' > docker-bake.hcl
|
||||||
|
variable "TAG" {
|
||||||
|
default = "latest"
|
||||||
|
}
|
||||||
|
|
||||||
|
group "default" {
|
||||||
|
targets = ["webapp"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp" {
|
||||||
|
args = {
|
||||||
|
buildno = "${add(123, 1)}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"buildno": "124"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example of defining an `increment` function:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cat <<'EOF' > docker-bake.hcl
|
||||||
|
function "increment" {
|
||||||
|
params = [number]
|
||||||
|
result = number + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
group "default" {
|
||||||
|
targets = ["webapp"]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp" {
|
||||||
|
args = {
|
||||||
|
buildno = "${increment(123)}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"buildno": "124"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example of only adding tags if a variable is not empty using an `notequal`
|
||||||
|
function:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cat <<'EOF' > docker-bake.hcl
|
||||||
|
variable "TAG" {default="" }
|
||||||
|
|
||||||
|
group "default" {
|
||||||
|
targets = [
|
||||||
|
"webapp",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
target "webapp" {
|
||||||
|
context="."
|
||||||
|
dockerfile="Dockerfile"
|
||||||
|
tags = [
|
||||||
|
"my-image:latest",
|
||||||
|
notequal("",TAG) ? "my-image:${TAG}": "",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ docker buildx bake --print webapp
|
||||||
|
{
|
||||||
|
"target": {
|
||||||
|
"webapp": {
|
||||||
|
"context": ".",
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"tags": [
|
||||||
|
"my-image:latest"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,189 @@
|
|||||||
|
# buildx create
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx create [OPTIONS] [CONTEXT|ENDPOINT]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Create a new builder instance
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| [`--append`](#append) | Append a node to builder instead of changing it |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| [`--buildkitd-flags string`](#buildkitd-flags) | Flags for buildkitd daemon |
|
||||||
|
| [`--config string`](#config) | BuildKit config file |
|
||||||
|
| [`--driver string`](#driver) | Driver to use (available: []) |
|
||||||
|
| [`--driver-opt stringArray`](#driver-opt) | Options for the driver |
|
||||||
|
| [`--leave`](#leave) | Remove a node from builder instead of changing it |
|
||||||
|
| [`--name string`](#name) | Builder instance name |
|
||||||
|
| [`--node string`](#node) | Create/modify node with given name |
|
||||||
|
| [`--platform stringArray`](#platform) | Fixed platforms for current node |
|
||||||
|
| [`--use`](#use) | Set the current builder instance |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Create makes a new builder instance pointing to a docker context or endpoint,
|
||||||
|
where context is the name of a context from `docker context ls` and endpoint is
|
||||||
|
the address for docker socket (eg. `DOCKER_HOST` value).
|
||||||
|
|
||||||
|
By default, the current Docker configuration is used for determining the
|
||||||
|
context/endpoint value.
|
||||||
|
|
||||||
|
Builder instances are isolated environments where builds can be invoked. All
|
||||||
|
Docker contexts also get the default builder instance.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### <a name="append"></a> Append a new node to an existing builder (--append)
|
||||||
|
|
||||||
|
The `--append` flag changes the action of the command to append a new node to an
|
||||||
|
existing builder specified by `--name`. Buildx will choose an appropriate node
|
||||||
|
for a build based on the platforms it supports.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx create mycontext1
|
||||||
|
eager_beaver
|
||||||
|
|
||||||
|
$ docker buildx create --name eager_beaver --append mycontext2
|
||||||
|
eager_beaver
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="buildkitd-flags"></a> Specify options for the buildkitd daemon (--buildkitd-flags)
|
||||||
|
|
||||||
|
```
|
||||||
|
--buildkitd-flags FLAGS
|
||||||
|
```
|
||||||
|
|
||||||
|
Adds flags when starting the buildkitd daemon. They take precedence over the
|
||||||
|
configuration file specified by [`--config`](#--config-file). See `buildkitd --help`
|
||||||
|
for the available flags.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
```
|
||||||
|
--buildkitd-flags '--debug --debugaddr 0.0.0.0:6666'
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="config"></a> Specify a configuration file for the buildkitd daemon (--config)
|
||||||
|
|
||||||
|
```
|
||||||
|
--config FILE
|
||||||
|
```
|
||||||
|
|
||||||
|
Specifies the configuration file for the buildkitd daemon to use. The configuration
|
||||||
|
can be overridden by [`--buildkitd-flags`](#--buildkitd-flags-flags).
|
||||||
|
See an [example buildkitd configuration file](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md).
|
||||||
|
|
||||||
|
### <a name="driver"></a> Set the builder driver to use (--driver)
|
||||||
|
|
||||||
|
```
|
||||||
|
--driver DRIVER
|
||||||
|
```
|
||||||
|
|
||||||
|
Sets the builder driver to be used. There are two available drivers, each have
|
||||||
|
their own specificities.
|
||||||
|
|
||||||
|
- `docker` - Uses the builder that is built into the docker daemon. With this
|
||||||
|
driver, the [`--load`](buildx_build.md#--load) flag is implied by default on
|
||||||
|
`buildx build`. However, building multi-platform images or exporting cache is
|
||||||
|
not currently supported.
|
||||||
|
- `docker-container` - Uses a buildkit container that will be spawned via docker.
|
||||||
|
With this driver, both building multi-platform images and exporting cache are
|
||||||
|
supported. However, images built will not automatically appear in `docker images`
|
||||||
|
(see [`build --load`](buildx_build.md#--load)).
|
||||||
|
- `kubernetes` - Uses a kubernetes pods. With this driver, you can spin up pods
|
||||||
|
with defined buildkit container image to build your images.
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="driver-opt"></a> Set additional driver-specific options (--driver-opt)
|
||||||
|
|
||||||
|
```
|
||||||
|
--driver-opt OPTIONS
|
||||||
|
```
|
||||||
|
|
||||||
|
Passes additional driver-specific options. Details for each driver:
|
||||||
|
|
||||||
|
- `docker` - No driver options
|
||||||
|
- `docker-container`
|
||||||
|
- `image=IMAGE` - Sets the container image to be used for running buildkit.
|
||||||
|
- `network=NETMODE` - Sets the network mode for running the buildkit container.
|
||||||
|
- Example:
|
||||||
|
|
||||||
|
```console
|
||||||
|
--driver docker-container --driver-opt image=moby/buildkit:master,network=host
|
||||||
|
```
|
||||||
|
- `kubernetes`
|
||||||
|
- `image=IMAGE` - Sets the container image to be used for running buildkit.
|
||||||
|
- `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace.
|
||||||
|
- `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1.
|
||||||
|
- `requests.cpu` - Sets the request CPU value specified in units of Kubernetes CPU. Example `requests.cpu=100m`, `requests.cpu=2`
|
||||||
|
- `requests.memory` - Sets the request memory value specified in bytes or with a valid suffix. Example `requests.memory=500Mi`, `requests.memory=4G`
|
||||||
|
- `limits.cpu` - Sets the limit CPU value specified in units of Kubernetes CPU. Example `limits.cpu=100m`, `limits.cpu=2`
|
||||||
|
- `limits.memory` - Sets the limit memory value specified in bytes or with a valid suffix. Example `limits.memory=500Mi`, `limits.memory=4G`
|
||||||
|
- `nodeselector="label1=value1,label2=value2"` - Sets the kv of `Pod` nodeSelector. No Defaults. Example `nodeselector=kubernetes.io/arch=arm64`
|
||||||
|
- `rootless=(true|false)` - Run the container as a non-root user without `securityContext.privileged`. [Using Ubuntu host kernel is recommended](https://github.com/moby/buildkit/blob/master/docs/rootless.md). Defaults to false.
|
||||||
|
- `loadbalance=(sticky|random)` - Load-balancing strategy. If set to "sticky", the pod is chosen using the hash of the context path. Defaults to "sticky"
|
||||||
|
|
||||||
|
### <a name="leave"></a> Remove a node from a builder (--leave)
|
||||||
|
|
||||||
|
The `--leave` flag changes the action of the command to remove a node from a
|
||||||
|
builder. The builder needs to be specified with `--name` and node that is removed
|
||||||
|
is set with `--node`.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx create --name mybuilder --node mybuilder0 --leave
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="name"></a> Specify the name of the builder (--name)
|
||||||
|
|
||||||
|
```
|
||||||
|
--name NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
The `--name` flag specifies the name of the builder to be created or modified.
|
||||||
|
If none is specified, one will be automatically generated.
|
||||||
|
|
||||||
|
### <a name="node"></a> Specify the name of the node (--node)
|
||||||
|
|
||||||
|
```
|
||||||
|
--node NODE
|
||||||
|
```
|
||||||
|
|
||||||
|
The `--node` flag specifies the name of the node to be created or modified. If
|
||||||
|
none is specified, it is the name of the builder it belongs to, with an index
|
||||||
|
number suffix.
|
||||||
|
|
||||||
|
### <a name="platform"></a> Set the platforms supported by the node
|
||||||
|
|
||||||
|
```
|
||||||
|
--platform PLATFORMS
|
||||||
|
```
|
||||||
|
|
||||||
|
The `--platform` flag sets the platforms supported by the node. It expects a
|
||||||
|
comma-separated list of platforms of the form OS/architecture/variant. The node
|
||||||
|
will also automatically detect the platforms it supports, but manual values take
|
||||||
|
priority over the detected ones and can be used when multiple nodes support
|
||||||
|
building for the same platform.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx create --platform linux/amd64
|
||||||
|
$ docker buildx create --platform linux/arm64,linux/arm/v8
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="use"></a> Automatically switch to the newly created builder
|
||||||
|
|
||||||
|
The `--use` flag automatically switches the current builder to the newly created
|
||||||
|
one. Equivalent to running `docker buildx use $(docker buildx create ...)`.
|
@ -0,0 +1,19 @@
|
|||||||
|
# buildx du
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx du
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Disk usage
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| `--filter filter` | Provide filter values |
|
||||||
|
| `--verbose` | Provide a more verbose output |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
@ -0,0 +1,24 @@
|
|||||||
|
# buildx imagetools
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx imagetools [OPTIONS] COMMAND
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Commands to work on images in registry
|
||||||
|
|
||||||
|
### Subcommands
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| [`create`](buildx_imagetools_create.md) | Create a new image based on source images |
|
||||||
|
| [`inspect`](buildx_imagetools_inspect.md) | Show details of image in the registry |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Imagetools contains commands for working with manifest lists in the registry.
|
||||||
|
These commands are useful for inspecting multi-platform build results.
|
@ -0,0 +1,80 @@
|
|||||||
|
# buildx imagetools create
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx imagetools create [OPTIONS] [SOURCE] [SOURCE...]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Create a new image based on source images
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| [`--append`](#append) | Append to existing manifest |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| [`--dry-run`](#dry-run) | Show final image instead of pushing |
|
||||||
|
| [`-f`](#file), [`--file stringArray`](#file) | Read source descriptor from file |
|
||||||
|
| [`-t`](#tag), [`--tag stringArray`](#tag) | Set reference for new image |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Imagetools contains commands for working with manifest lists in the registry.
|
||||||
|
These commands are useful for inspecting multi-platform build results.
|
||||||
|
|
||||||
|
Create a new manifest list based on source manifests. The source manifests can
|
||||||
|
be manifest lists or single platform distribution manifests and must already
|
||||||
|
exist in the registry where the new manifest is created. If only one source is
|
||||||
|
specified, create performs a carbon copy.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### <a name="append"></a> Append new sources to an existing manifest list (--append)
|
||||||
|
|
||||||
|
Use the `--append` flag to append the new sources to an existing manifest list
|
||||||
|
in the destination.
|
||||||
|
|
||||||
|
### <a name="dry-run"></a> Show final image instead of pushing (--dry-run)
|
||||||
|
|
||||||
|
Use the `--dry-run` flag to not push the image, just show it.
|
||||||
|
|
||||||
|
### <a name="file"></a> Read source descriptor from a file (-f, --file)
|
||||||
|
|
||||||
|
```
|
||||||
|
-f FILE or --file FILE
|
||||||
|
```
|
||||||
|
|
||||||
|
Reads source from files. A source can be a manifest digest, manifest reference,
|
||||||
|
or a JSON of OCI descriptor object.
|
||||||
|
|
||||||
|
In order to define annotations or additional platform properties like `os.version` and
|
||||||
|
`os.features` you need to add them in the OCI descriptor object encoded in JSON.
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx imagetools inspect --raw alpine | jq '.manifests[0] | .platform."os.version"="10.1"' > descr.json
|
||||||
|
docker buildx imagetools create -f descr.json myuser/image
|
||||||
|
```
|
||||||
|
|
||||||
|
The descriptor in the file is merged with existing descriptor in the registry if it exists.
|
||||||
|
|
||||||
|
The supported fields for the descriptor are defined in [OCI spec](https://github.com/opencontainers/image-spec/blob/master/descriptor.md#properties) .
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="tag"></a> Set reference for new image (-t, --tag)
|
||||||
|
|
||||||
|
```
|
||||||
|
-t IMAGE or --tag IMAGE
|
||||||
|
```
|
||||||
|
|
||||||
|
Use the `-t` or `--tag` flag to set the name of the image to be created.
|
||||||
|
|
||||||
|
**Examples**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx imagetools create --dry-run alpine@sha256:5c40b3c27b9f13c873fefb2139765c56ce97fd50230f1f2d5c91e55dec171907 sha256:c4ba6347b0e4258ce6a6de2401619316f982b7bcc529f73d2a410d0097730204
|
||||||
|
|
||||||
|
$ docker buildx imagetools create -t tonistiigi/myapp -f image1 -f image2
|
||||||
|
```
|
@ -0,0 +1,47 @@
|
|||||||
|
# buildx imagetools inspect
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx imagetools inspect [OPTIONS] NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Show details of image in the registry
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| [`--raw`](#raw) | Show original JSON manifest |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Show details of image in the registry.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx imagetools inspect alpine
|
||||||
|
|
||||||
|
Name: docker.io/library/alpine:latest
|
||||||
|
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
|
||||||
|
Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913
|
||||||
|
|
||||||
|
Manifests:
|
||||||
|
Name: docker.io/library/alpine:latest@sha256:5c40b3c27b9f13c873fefb2139765c56ce97fd50230f1f2d5c91e55dec171907
|
||||||
|
MediaType: application/vnd.docker.distribution.manifest.v2+json
|
||||||
|
Platform: linux/amd64
|
||||||
|
|
||||||
|
Name: docker.io/library/alpine:latest@sha256:c4ba6347b0e4258ce6a6de2401619316f982b7bcc529f73d2a410d0097730204
|
||||||
|
MediaType: application/vnd.docker.distribution.manifest.v2+json
|
||||||
|
Platform: linux/arm/v6
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="raw"></a> Show original, unformatted JSON manifest (--raw)
|
||||||
|
|
||||||
|
Use the `--raw` option to print the original JSON bytes instead of the formatted
|
||||||
|
output.
|
@ -0,0 +1,58 @@
|
|||||||
|
# buildx inspect
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx inspect [NAME]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Inspect current builder instance
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| [`--bootstrap`](#bootstrap) | Ensure builder has booted before inspecting |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Shows information about the current or specified builder.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Get information about a builder instance
|
||||||
|
|
||||||
|
By default, `inspect` shows information about the current builder. Specify the
|
||||||
|
name of the builder to inspect to get information about that builder.
|
||||||
|
The following example shows information about a builder instance named
|
||||||
|
`elated_tesla`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx inspect elated_tesla
|
||||||
|
|
||||||
|
Name: elated_tesla
|
||||||
|
Driver: docker-container
|
||||||
|
|
||||||
|
Nodes:
|
||||||
|
Name: elated_tesla0
|
||||||
|
Endpoint: unix:///var/run/docker.sock
|
||||||
|
Status: running
|
||||||
|
Platforms: linux/amd64
|
||||||
|
|
||||||
|
Name: elated_tesla1
|
||||||
|
Endpoint: ssh://ubuntu@1.2.3.4
|
||||||
|
Status: running
|
||||||
|
Platforms: linux/arm64, linux/arm/v7, linux/arm/v6
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name="bootstrap"></a> Ensure that the builder is running before inspecting (--bootstrap)
|
||||||
|
|
||||||
|
Use the `--bootstrap` option to ensure that the builder is running before
|
||||||
|
inspecting it. If the driver is `docker-container`, then `--bootstrap` starts
|
||||||
|
the buildkit container and waits until it is operational. Bootstrapping is
|
||||||
|
automatically done during build, and therefore not necessary. The same BuildKit
|
||||||
|
container is used during the lifetime of the associated builder node (as
|
||||||
|
displayed in `buildx ls`).
|
@ -0,0 +1,11 @@
|
|||||||
|
# buildx install
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx install
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Install buildx as a 'docker builder' alias
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
@ -0,0 +1,31 @@
|
|||||||
|
# buildx ls
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx ls
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
List builder instances
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Lists all builder instances and the nodes for each instance
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx ls
|
||||||
|
|
||||||
|
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
|
||||||
|
elated_tesla * docker-container
|
||||||
|
elated_tesla0 unix:///var/run/docker.sock running linux/amd64
|
||||||
|
elated_tesla1 ssh://ubuntu@1.2.3.4 running linux/arm64, linux/arm/v7, linux/arm/v6
|
||||||
|
default docker
|
||||||
|
default default running linux/amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
Each builder has one or more nodes associated with it. The current builder's
|
||||||
|
name is marked with a `*`.
|
@ -0,0 +1,23 @@
|
|||||||
|
# buildx prune
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx prune
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Remove build cache
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `-a`, `--all` | Remove all unused images, not just dangling ones |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| `--filter filter` | Provide filter values (e.g. 'until=24h') |
|
||||||
|
| `-f`, `--force` | Do not prompt for confirmation |
|
||||||
|
| `--keep-storage bytes` | Amount of disk space to keep for cache |
|
||||||
|
| `--verbose` | Provide a more verbose output |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
@ -0,0 +1,16 @@
|
|||||||
|
# buildx rm
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx rm [NAME]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Remove a builder instance
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Removes the specified or current builder. It is a no-op attempting to remove the
|
||||||
|
default builder.
|
@ -0,0 +1,16 @@
|
|||||||
|
# buildx stop
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx stop [NAME]
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Stop builder instance
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Stops the specified or current builder. This will not prevent buildx build to
|
||||||
|
restart the builder. The implementation of stop depends on the driver.
|
@ -0,0 +1,11 @@
|
|||||||
|
# buildx uninstall
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx uninstall
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Uninstall the 'docker builder' alias
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
@ -0,0 +1,25 @@
|
|||||||
|
# buildx use
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx use [OPTIONS] NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Set the current builder instance
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `--builder string` | Override the configured builder instance |
|
||||||
|
| `--default` | Set builder as default for current context |
|
||||||
|
| `--global` | Builder persists context changes |
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Switches the current builder instance. Build commands invoked after this command
|
||||||
|
will run on a specified builder. Alternatively, a context name can be used to
|
||||||
|
switch to the default builder of that context.
|
@ -0,0 +1,21 @@
|
|||||||
|
# buildx version
|
||||||
|
|
||||||
|
```
|
||||||
|
docker buildx version
|
||||||
|
```
|
||||||
|
|
||||||
|
<!---MARKER_GEN_START-->
|
||||||
|
Show buildx version information
|
||||||
|
|
||||||
|
|
||||||
|
<!---MARKER_GEN_END-->
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### View version information
|
||||||
|
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker buildx version
|
||||||
|
github.com/docker/buildx v0.5.1-docker 11057da37336192bfc57d81e02359ba7ba848e4a
|
||||||
|
```
|
@ -1,72 +1,71 @@
|
|||||||
module github.com/docker/buildx
|
module github.com/docker/buildx
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
|
|
||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
|
||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
|
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
|
||||||
github.com/bugsnag/bugsnag-go v1.4.1 // indirect
|
github.com/bugsnag/bugsnag-go v1.4.1 // indirect
|
||||||
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
github.com/bugsnag/panicwrap v1.2.0 // indirect
|
||||||
github.com/cenkalti/backoff v2.1.1+incompatible // indirect
|
github.com/cenkalti/backoff v2.1.1+incompatible // indirect
|
||||||
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
|
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
|
||||||
github.com/containerd/console v0.0.0-20191219165238-8375c3424e4d
|
github.com/containerd/console v1.0.1
|
||||||
github.com/containerd/containerd v1.4.0-0
|
github.com/containerd/containerd v1.5.0-beta.4
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
|
github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
|
||||||
github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24
|
github.com/docker/cli v20.10.5+incompatible
|
||||||
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
|
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
|
||||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
|
github.com/docker/distribution v2.7.1+incompatible
|
||||||
github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
|
github.com/docker/docker v20.10.5+incompatible
|
||||||
github.com/docker/docker-credential-helpers v0.6.1 // indirect
|
github.com/docker/docker-credential-helpers v0.6.4-0.20210125172408-38bea2ce277a // indirect
|
||||||
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
|
||||||
github.com/docker/go-connections v0.4.0 // indirect
|
|
||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
|
||||||
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
|
github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
|
||||||
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
|
||||||
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
|
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.4.1 // indirect
|
github.com/fvbommel/sortorder v1.0.1 // indirect
|
||||||
github.com/gofrs/flock v0.7.2
|
github.com/go-sql-driver/mysql v1.5.0 // indirect
|
||||||
github.com/gofrs/uuid v3.2.0+incompatible // indirect
|
github.com/gofrs/flock v0.7.3
|
||||||
|
github.com/gofrs/uuid v3.3.0+incompatible // indirect
|
||||||
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
github.com/google/certificate-transparency-go v1.0.21 // indirect
|
||||||
github.com/google/shlex v0.0.0-20150127133951-6f45313302b9
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||||
github.com/googleapis/gnostic v0.3.1 // indirect
|
|
||||||
github.com/gophercloud/gophercloud v0.6.0 // indirect
|
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
|
||||||
github.com/hashicorp/hcl/v2 v2.6.0
|
github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840
|
||||||
|
github.com/hashicorp/hcl/v2 v2.8.2
|
||||||
github.com/jinzhu/gorm v1.9.2 // indirect
|
github.com/jinzhu/gorm v1.9.2 // indirect
|
||||||
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a // indirect
|
||||||
github.com/jinzhu/now v1.0.0 // indirect
|
github.com/jinzhu/now v1.0.0 // indirect
|
||||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
|
||||||
github.com/lib/pq v1.0.0 // indirect
|
github.com/lib/pq v1.10.0 // indirect
|
||||||
github.com/mattn/go-shellwords v1.0.5 // indirect
|
|
||||||
github.com/mattn/go-sqlite3 v1.10.0 // indirect
|
github.com/mattn/go-sqlite3 v1.10.0 // indirect
|
||||||
github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19 // indirect
|
github.com/moby/buildkit v0.8.2-0.20210401015549-df49b648c8bf
|
||||||
github.com/moby/buildkit v0.7.2
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1
|
|
||||||
github.com/opencontainers/image-spec v1.0.1
|
github.com/opencontainers/image-spec v1.0.1
|
||||||
github.com/opencontainers/selinux v1.3.3 // indirect
|
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
|
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
|
||||||
github.com/sirupsen/logrus v1.6.0
|
github.com/sirupsen/logrus v1.7.0
|
||||||
github.com/spf13/cobra v1.0.0
|
github.com/spf13/cobra v1.1.1
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/stretchr/testify v1.4.0
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/theupdateframework/notary v0.6.1 // indirect
|
github.com/theupdateframework/notary v0.6.1 // indirect
|
||||||
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
|
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
|
||||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1 // indirect
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
github.com/zclconf/go-cty v1.4.0
|
github.com/zclconf/go-cty v1.7.1
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
|
||||||
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
|
||||||
gopkg.in/fatih/pool.v2 v2.0.0 // indirect
|
gopkg.in/fatih/pool.v2 v2.0.0 // indirect
|
||||||
gopkg.in/gorethink/gorethink.v3 v3.0.5 // indirect
|
gopkg.in/gorethink/gorethink.v3 v3.0.5 // indirect
|
||||||
k8s.io/api v0.16.7
|
k8s.io/api v0.20.1
|
||||||
k8s.io/apimachinery v0.16.7
|
k8s.io/apimachinery v0.20.1
|
||||||
k8s.io/client-go v0.16.7
|
k8s.io/client-go v0.20.1
|
||||||
vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/containerd/containerd => github.com/containerd/containerd v1.3.1-0.20200227195959-4d242818bf55
|
replace (
|
||||||
|
// protobuf: corresponds to containerd (through buildkit)
|
||||||
replace github.com/docker/docker => github.com/docker/docker v1.4.2-0.20200227233006-38f52c9fec82
|
github.com/golang/protobuf => github.com/golang/protobuf v1.3.5
|
||||||
|
github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
|
||||||
|
|
||||||
replace github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
|
// genproto: corresponds to containerd (through buildkit)
|
||||||
|
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63
|
||||||
go 1.13
|
// grpc: corresponds to protobuf
|
||||||
|
google.golang.org/grpc => google.golang.org/grpc v1.30.0
|
||||||
|
)
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"Vendor": true,
|
|
||||||
"Deadline": "8m",
|
|
||||||
"Exclude": [".*.pb.go"],
|
|
||||||
"DisableAll": true,
|
|
||||||
"Enable": [
|
|
||||||
"gofmt",
|
|
||||||
"goimports",
|
|
||||||
"ineffassign",
|
|
||||||
"vet",
|
|
||||||
"deadcode"
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,56 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
|
set -eu
|
||||||
|
|
||||||
: ${TARGETPLATFORM=$CLI_PLATFORM}
|
: ${TARGETPLATFORM=$CLI_PLATFORM}
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
|
|
||||||
set -ex
|
platformFlag=""
|
||||||
|
if [ -n "$TARGETPLATFORM" ]; then
|
||||||
|
platformFlag="--platform $TARGETPLATFORM"
|
||||||
|
fi
|
||||||
|
|
||||||
progressFlag=""
|
buildxCmd build $platformFlag \
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
--target "binaries" \
|
||||||
|
--output "type=local,dest=./bin/" \
|
||||||
binariesDocker() {
|
.
|
||||||
mkdir -p bin/tmp
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
|
|
||||||
platformFlag=""
|
|
||||||
if [ -n "$TARGETPLATFORM" ]; then
|
|
||||||
platformFlag="--build-arg=TARGETPLATFORM=$TARGETPLATFORM"
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker build $platformFlag --target=binaries --iidfile $iidfile --force-rm .
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
containerID=$(docker create $iid copy)
|
|
||||||
docker cp $containerID:/ bin/tmp
|
|
||||||
mv bin/tmp/build* bin/
|
|
||||||
rm -rf bin/tmp
|
|
||||||
docker rm $containerID
|
|
||||||
docker rmi -f $iid
|
|
||||||
rm -f $iidfile
|
|
||||||
}
|
|
||||||
|
|
||||||
binaries() {
|
|
||||||
platformFlag=""
|
|
||||||
if [ ! -z "$TARGETPLATFORM" ]; then
|
|
||||||
platformFlag="--frontend-opt=platform=$TARGETPLATFORM"
|
|
||||||
fi
|
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
|
||||||
--local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt target=binaries $platformFlag \
|
|
||||||
--output type=local,dest=./bin/
|
|
||||||
}
|
|
||||||
|
|
||||||
case $buildmode in
|
|
||||||
"buildkit")
|
|
||||||
binaries
|
|
||||||
;;
|
|
||||||
"docker-buildkit")
|
|
||||||
binariesDocker
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
TYP=$1
|
||||||
|
|
||||||
|
. $(dirname $0)/util
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "usage: ./hack/build_ci_first_pass <binaries>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$TYP" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
importCacheFlags=""
|
||||||
|
exportCacheFlags=""
|
||||||
|
if [ "$GITHUB_ACTIONS" = "true" ]; then
|
||||||
|
if [ -n "$cacheRefFrom" ]; then
|
||||||
|
importCacheFlags="--cache-from=type=local,src=$cacheRefFrom"
|
||||||
|
fi
|
||||||
|
if [ -n "$cacheRefTo" ]; then
|
||||||
|
exportCacheFlags="--cache-to=type=local,dest=$cacheRefTo"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $TYP in
|
||||||
|
"binaries")
|
||||||
|
buildxCmd build $importCacheFlags $exportCacheFlags \
|
||||||
|
--target "binaries" \
|
||||||
|
$currentcontext
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo >&2 "Unknown type $TYP"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
@ -1,20 +1,24 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
|
set -e
|
||||||
|
|
||||||
: ${TARGETPLATFORM=linux/amd64,linux/arm/v7,linux/arm64,darwin/amd64,windows/amd64,linux/ppc64le,linux/s390x}
|
: ${TARGETPLATFORM=linux/amd64,linux/arm/v7,linux/arm64,darwin/amd64,windows/amd64,linux/ppc64le,linux/s390x}
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
|
||||||
: ${EXPORT_LOCAL=}
|
: ${EXPORT_LOCAL=}
|
||||||
|
|
||||||
set -ex
|
importCacheFlags=""
|
||||||
|
if [ "$GITHUB_ACTIONS" = "true" ]; then
|
||||||
|
if [ -n "$cacheRefFrom" ]; then
|
||||||
|
importCacheFlags="--cache-from=type=local,src=$cacheRefFrom"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
exportFlag=""
|
exportFlag=""
|
||||||
if [ -n "$EXPORT_LOCAL" ]; then
|
if [ -n "$EXPORT_LOCAL" ]; then
|
||||||
exportFlag="--output=type=local,dest=$EXPORT_LOCAL"
|
exportFlag="--output=type=local,dest=$EXPORT_LOCAL"
|
||||||
fi
|
|
||||||
|
|
||||||
progressFlag=""
|
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain";
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 --local context=. --local dockerfile=. --opt platform=$TARGETPLATFORM $exportFlag --opt target=binaries
|
buildxCmd build $importCacheFlags $exportFlag \
|
||||||
|
--target "binaries" \
|
||||||
|
--platform "$TARGETPLATFORM" \
|
||||||
|
$currentcontext
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
# syntax = docker/dockerfile:1.2
|
||||||
|
|
||||||
|
FROM golang:1.16-alpine AS docsgen
|
||||||
|
WORKDIR /src
|
||||||
|
RUN --mount=target=. \
|
||||||
|
--mount=target=/root/.cache,type=cache \
|
||||||
|
go build -mod=vendor -o /out/docsgen ./docs/docsgen
|
||||||
|
|
||||||
|
FROM alpine AS gen
|
||||||
|
RUN apk add --no-cache rsync git
|
||||||
|
WORKDIR /src
|
||||||
|
COPY --from=docsgen /out/docsgen /usr/bin
|
||||||
|
RUN --mount=target=/context \
|
||||||
|
--mount=target=.,type=tmpfs,readwrite \
|
||||||
|
rsync -a /context/. . && \
|
||||||
|
docsgen && \
|
||||||
|
mkdir /out && cp -r docs/reference /out
|
||||||
|
|
||||||
|
FROM scratch AS update
|
||||||
|
COPY --from=gen /out /out
|
||||||
|
|
||||||
|
FROM gen AS validate
|
||||||
|
RUN --mount=target=/context \
|
||||||
|
--mount=target=.,type=tmpfs,readwrite \
|
||||||
|
rsync -a /context/. . && \
|
||||||
|
git add -A && \
|
||||||
|
rm -rf docs/reference/* && \
|
||||||
|
cp -rf /out/* ./docs/ && \
|
||||||
|
./hack/validate-docs check
|
@ -1,10 +1,10 @@
|
|||||||
# syntax=docker/dockerfile:1.0-experimental
|
# syntax=docker/dockerfile:1.2
|
||||||
|
|
||||||
FROM golang:1.13-alpine
|
FROM golang:1.16-alpine
|
||||||
RUN apk add --no-cache git
|
RUN apk add --no-cache gcc musl-dev yamllint
|
||||||
RUN go get -u gopkg.in/alecthomas/gometalinter.v1 \
|
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.36.0
|
||||||
&& mv /go/bin/gometalinter.v1 /go/bin/gometalinter \
|
|
||||||
&& gometalinter --install
|
|
||||||
WORKDIR /go/src/github.com/docker/buildx
|
WORKDIR /go/src/github.com/docker/buildx
|
||||||
RUN --mount=target=/go/src/github.com/docker/buildx \
|
RUN --mount=target=/go/src/github.com/docker/buildx --mount=target=/root/.cache,type=cache \
|
||||||
gometalinter --config=gometalinter.json ./...
|
golangci-lint run
|
||||||
|
RUN --mount=target=/go/src/github.com/docker/buildx --mount=target=/root/.cache,type=cache \
|
||||||
|
yamllint -c .yamllint.yml --strict .
|
@ -1,37 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail -x
|
set -eu
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
buildxCmd build --file ./hack/dockerfiles/lint.Dockerfile .
|
||||||
|
|
||||||
progressFlag=""
|
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
|
||||||
|
|
||||||
lintDocker() {
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
docker build --iidfile $iidfile -f ./hack/dockerfiles/lint.Dockerfile --force-rm .
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
docker rmi $iid
|
|
||||||
rm -f $iidfile
|
|
||||||
}
|
|
||||||
|
|
||||||
lint() {
|
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 \
|
|
||||||
--local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt filename=./hack/dockerfiles/lint.Dockerfile
|
|
||||||
}
|
|
||||||
|
|
||||||
case $buildmode in
|
|
||||||
"buildkit")
|
|
||||||
lint
|
|
||||||
;;
|
|
||||||
"docker-buildkit")
|
|
||||||
lintDocker
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
. $(dirname $0)/util
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
output=$(mktemp -d -t buildx-output.XXXXXXXXXX)
|
||||||
|
|
||||||
|
buildxCmd build \
|
||||||
|
--target "update" \
|
||||||
|
--output "type=local,dest=$output" \
|
||||||
|
--file "./hack/dockerfiles/docs.Dockerfile" \
|
||||||
|
.
|
||||||
|
|
||||||
|
rm -rf ./docs/reference/*
|
||||||
|
cp -R "$output"/out/* ./docs/
|
||||||
|
rm -rf $output
|
@ -1,45 +1,16 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
. $(dirname $0)/util
|
. $(dirname $0)/util
|
||||||
set -eu -o pipefail -x
|
set -eu
|
||||||
|
|
||||||
: ${CONTINUOUS_INTEGRATION=}
|
output=$(mktemp -d -t buildx-output.XXXXXXXXXX)
|
||||||
|
|
||||||
progressFlag=""
|
buildxCmd build \
|
||||||
if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi
|
--target "update" \
|
||||||
|
--output "type=local,dest=$output" \
|
||||||
|
--file "./hack/dockerfiles/vendor.Dockerfile" \
|
||||||
|
.
|
||||||
|
|
||||||
case $buildmode in
|
rm -rf ./vendor
|
||||||
"buildkit")
|
cp -R "$output"/out/* .
|
||||||
output=$(mktemp -d -t buildctl-output.XXXXXXXXXX)
|
rm -rf $output
|
||||||
buildctl build $progressFlag --frontend=dockerfile.v0 --local context=. --local dockerfile=. \
|
|
||||||
--frontend-opt target=update \
|
|
||||||
--frontend-opt filename=./hack/dockerfiles/vendor.Dockerfile \
|
|
||||||
--output type=local,dest=$output
|
|
||||||
rm -rf ./vendor
|
|
||||||
cp -R "$output/out/" .
|
|
||||||
rm -rf $output
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
|
|
||||||
case $buildmode in
|
|
||||||
"docker-buildkit")
|
|
||||||
export DOCKER_BUILDKIT=1
|
|
||||||
docker build --iidfile $iidfile -f ./hack/dockerfiles/vendor.Dockerfile --target update --force-rm .
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "buildctl or docker with buildkit support is required"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
iid=$(cat $iidfile)
|
|
||||||
cid=$(docker create $iid noop)
|
|
||||||
rm -rf ./vendor
|
|
||||||
|
|
||||||
docker cp $cid:/out/go.mod .
|
|
||||||
docker cp $cid:/out/go.sum .
|
|
||||||
docker cp $cid:/out/vendor .
|
|
||||||
|
|
||||||
docker rm $cid
|
|
||||||
rm -f $iidfile
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
case ${1:-} in
|
||||||
|
'')
|
||||||
|
. $(dirname $0)/util
|
||||||
|
buildxCmd build \
|
||||||
|
--target validate \
|
||||||
|
--file ./hack/dockerfiles/docs.Dockerfile \
|
||||||
|
.
|
||||||
|
;;
|
||||||
|
check)
|
||||||
|
status="$(git status --porcelain -- docs/reference 2>/dev/null)"
|
||||||
|
diffs=$(echo "$status" | grep -v '^[RAD] ' || true)
|
||||||
|
if [ "$diffs" ]; then
|
||||||
|
{
|
||||||
|
set +x
|
||||||
|
echo 'The result of ./hack/update-docs differs'
|
||||||
|
echo
|
||||||
|
echo "$diffs"
|
||||||
|
echo
|
||||||
|
echo 'Please vendor your package with ./hack/update-docs'
|
||||||
|
echo
|
||||||
|
} >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo 'Congratulations! All docs changes are done the right way.'
|
||||||
|
;;
|
||||||
|
esac
|
@ -1,4 +1,4 @@
|
|||||||
package build
|
package buildflags
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/moby/buildkit/util/entitlements"
|
"github.com/moby/buildkit/util/entitlements"
|
@ -1,4 +1,4 @@
|
|||||||
package build
|
package buildflags
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
@ -0,0 +1,79 @@
|
|||||||
|
package userfunc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/hashicorp/hcl/v2"
|
||||||
|
"github.com/zclconf/go-cty/cty/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
var funcBodySchema = &hcl.BodySchema{
|
||||||
|
Attributes: []hcl.AttributeSchema{
|
||||||
|
{
|
||||||
|
Name: "params",
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "variadic_param",
|
||||||
|
Required: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "result",
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeUserFunctions(body hcl.Body, blockType string, contextFunc ContextFunc) (funcs map[string]function.Function, remain hcl.Body, diags hcl.Diagnostics) {
|
||||||
|
schema := &hcl.BodySchema{
|
||||||
|
Blocks: []hcl.BlockHeaderSchema{
|
||||||
|
{
|
||||||
|
Type: blockType,
|
||||||
|
LabelNames: []string{"name"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
content, remain, diags := body.PartialContent(schema)
|
||||||
|
if diags.HasErrors() {
|
||||||
|
return nil, remain, diags
|
||||||
|
}
|
||||||
|
|
||||||
|
// first call to getBaseCtx will populate context, and then the same
|
||||||
|
// context will be used for all subsequent calls. It's assumed that
|
||||||
|
// all functions in a given body should see an identical context.
|
||||||
|
var baseCtx *hcl.EvalContext
|
||||||
|
getBaseCtx := func() *hcl.EvalContext {
|
||||||
|
if baseCtx == nil {
|
||||||
|
if contextFunc != nil {
|
||||||
|
baseCtx = contextFunc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// baseCtx might still be nil here, and that's okay
|
||||||
|
return baseCtx
|
||||||
|
}
|
||||||
|
|
||||||
|
funcs = make(map[string]function.Function)
|
||||||
|
|
||||||
|
for _, block := range content.Blocks {
|
||||||
|
name := block.Labels[0]
|
||||||
|
funcContent, funcDiags := block.Body.Content(funcBodySchema)
|
||||||
|
diags = append(diags, funcDiags...)
|
||||||
|
if funcDiags.HasErrors() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
paramsExpr := funcContent.Attributes["params"].Expr
|
||||||
|
resultExpr := funcContent.Attributes["result"].Expr
|
||||||
|
var varParamExpr hcl.Expression
|
||||||
|
if funcContent.Attributes["variadic_param"] != nil {
|
||||||
|
varParamExpr = funcContent.Attributes["variadic_param"].Expr
|
||||||
|
}
|
||||||
|
f, funcDiags := NewFunction(paramsExpr, varParamExpr, resultExpr, getBaseCtx)
|
||||||
|
if funcDiags.HasErrors() {
|
||||||
|
diags = append(diags, funcDiags...)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
funcs[name] = f
|
||||||
|
}
|
||||||
|
|
||||||
|
return funcs, remain, diags
|
||||||
|
}
|
@ -0,0 +1,125 @@
|
|||||||
|
package userfunc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/hashicorp/hcl/v2"
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
"github.com/zclconf/go-cty/cty/function"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A ContextFunc is a callback used to produce the base EvalContext for
|
||||||
|
// running a particular set of functions.
|
||||||
|
//
|
||||||
|
// This is a function rather than an EvalContext directly to allow functions
|
||||||
|
// to be decoded before their context is complete. This will be true, for
|
||||||
|
// example, for applications that wish to allow functions to refer to themselves.
|
||||||
|
//
|
||||||
|
// The simplest use of a ContextFunc is to give user functions access to the
|
||||||
|
// same global variables and functions available elsewhere in an application's
|
||||||
|
// configuration language, but more complex applications may use different
|
||||||
|
// contexts to support lexical scoping depending on where in a configuration
|
||||||
|
// structure a function declaration is found, etc.
|
||||||
|
type ContextFunc func() *hcl.EvalContext
|
||||||
|
|
||||||
|
// DecodeUserFunctions looks for blocks of the given type in the given body
|
||||||
|
// and, for each one found, interprets it as a custom function definition.
|
||||||
|
//
|
||||||
|
// On success, the result is a mapping of function names to implementations,
|
||||||
|
// along with a new body that represents the remaining content of the given
|
||||||
|
// body which can be used for further processing.
|
||||||
|
//
|
||||||
|
// The result expression of each function is parsed during decoding but not
|
||||||
|
// evaluated until the function is called.
|
||||||
|
//
|
||||||
|
// If the given ContextFunc is non-nil, it will be called to obtain the
|
||||||
|
// context in which the function result expressions will be evaluated. If nil,
|
||||||
|
// or if it returns nil, the result expression will have access only to
|
||||||
|
// variables named after the declared parameters. A non-nil context turns
|
||||||
|
// the returned functions into closures, bound to the given context.
|
||||||
|
//
|
||||||
|
// If the returned diagnostics set has errors then the function map and
|
||||||
|
// remain body may be nil or incomplete.
|
||||||
|
func DecodeUserFunctions(body hcl.Body, blockType string, context ContextFunc) (funcs map[string]function.Function, remain hcl.Body, diags hcl.Diagnostics) {
|
||||||
|
return decodeUserFunctions(body, blockType, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFunction creates a new function instance from preparsed HCL expressions.
|
||||||
|
func NewFunction(paramsExpr, varParamExpr, resultExpr hcl.Expression, getBaseCtx func() *hcl.EvalContext) (function.Function, hcl.Diagnostics) {
|
||||||
|
var params []string
|
||||||
|
var varParam string
|
||||||
|
|
||||||
|
paramExprs, paramsDiags := hcl.ExprList(paramsExpr)
|
||||||
|
if paramsDiags.HasErrors() {
|
||||||
|
return function.Function{}, paramsDiags
|
||||||
|
}
|
||||||
|
for _, paramExpr := range paramExprs {
|
||||||
|
param := hcl.ExprAsKeyword(paramExpr)
|
||||||
|
if param == "" {
|
||||||
|
return function.Function{}, hcl.Diagnostics{{
|
||||||
|
Severity: hcl.DiagError,
|
||||||
|
Summary: "Invalid param element",
|
||||||
|
Detail: "Each parameter name must be an identifier.",
|
||||||
|
Subject: paramExpr.Range().Ptr(),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
params = append(params, param)
|
||||||
|
}
|
||||||
|
|
||||||
|
if varParamExpr != nil {
|
||||||
|
varParam = hcl.ExprAsKeyword(varParamExpr)
|
||||||
|
if varParam == "" {
|
||||||
|
return function.Function{}, hcl.Diagnostics{{
|
||||||
|
Severity: hcl.DiagError,
|
||||||
|
Summary: "Invalid variadic_param",
|
||||||
|
Detail: "The variadic parameter name must be an identifier.",
|
||||||
|
Subject: varParamExpr.Range().Ptr(),
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spec := &function.Spec{}
|
||||||
|
for _, paramName := range params {
|
||||||
|
spec.Params = append(spec.Params, function.Parameter{
|
||||||
|
Name: paramName,
|
||||||
|
Type: cty.DynamicPseudoType,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if varParamExpr != nil {
|
||||||
|
spec.VarParam = &function.Parameter{
|
||||||
|
Name: varParam,
|
||||||
|
Type: cty.DynamicPseudoType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl := func(args []cty.Value) (cty.Value, error) {
|
||||||
|
ctx := getBaseCtx()
|
||||||
|
ctx = ctx.NewChild()
|
||||||
|
ctx.Variables = make(map[string]cty.Value)
|
||||||
|
|
||||||
|
// The cty function machinery guarantees that we have at least
|
||||||
|
// enough args to fill all of our params.
|
||||||
|
for i, paramName := range params {
|
||||||
|
ctx.Variables[paramName] = args[i]
|
||||||
|
}
|
||||||
|
if spec.VarParam != nil {
|
||||||
|
varArgs := args[len(params):]
|
||||||
|
ctx.Variables[varParam] = cty.TupleVal(varArgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
result, diags := resultExpr.Value(ctx)
|
||||||
|
if diags.HasErrors() {
|
||||||
|
// Smuggle the diagnostics out via the error channel, since
|
||||||
|
// a diagnostics sequence implements error. Caller can
|
||||||
|
// type-assert this to recover the individual diagnostics
|
||||||
|
// if desired.
|
||||||
|
return cty.DynamicVal, diags
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
spec.Type = func(args []cty.Value) (cty.Type, error) {
|
||||||
|
val, err := impl(args)
|
||||||
|
return val.Type(), err
|
||||||
|
}
|
||||||
|
spec.Impl = func(args []cty.Value, retType cty.Type) (cty.Value, error) {
|
||||||
|
return impl(args)
|
||||||
|
}
|
||||||
|
return function.New(spec), nil
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
* @microsoft/containerplat
|
@ -1,18 +1,14 @@
|
|||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
|
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b h1:ag/x1USPSsqHud38I9BAC88qdNLDHHtQ4mlgQIZPPNA=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue