mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 00:47:48 +08:00

Raise the maximum size limit for the dockerfile and correct the size check. The size check was intended to use the size attribute from the file stat, but the original gogo version confused the `Size()` method (which returned the size of the proto message) with the `Size` attribute (which was named `Size_`). During the conversion, we noticed the mistake but kept the incorrect behavior for the sake of keeping the conversion simple. This also raises the maximum limit because 512 kB is likely a bit too conservative. The limit has been raised to 2 MB and the limit has been included in the error message. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com>
74 lines
1.8 KiB
Go
74 lines
1.8 KiB
Go
package build
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/docker/buildx/driver"
|
|
"github.com/docker/buildx/util/progress"
|
|
"github.com/docker/go-units"
|
|
"github.com/moby/buildkit/client"
|
|
"github.com/moby/buildkit/client/llb"
|
|
gwclient "github.com/moby/buildkit/frontend/gateway/client"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
const maxDockerfileSize = 2 * 1024 * 1024 // 2 MB
|
|
|
|
func createTempDockerfileFromURL(ctx context.Context, d *driver.DriverHandle, url string, pw progress.Writer) (string, error) {
|
|
c, err := driver.Boot(ctx, 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{Internal: true}, "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 > maxDockerfileSize {
|
|
return nil, errors.Errorf("Dockerfile %s bigger than allowed max size (%s)", url, units.HumanSize(maxDockerfileSize))
|
|
}
|
|
|
|
dt, err := ref.ReadFile(ctx, gwclient.ReadRequest{
|
|
Filename: "Dockerfile",
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dir, err := os.MkdirTemp("", "buildx")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := os.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
|
|
}
|