mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 17:37:46 +08:00
build: prefer local image resolution for docker driver
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
b3a4f95110
commit
c2500ea2d8
@ -593,7 +593,10 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
|
|||||||
}
|
}
|
||||||
|
|
||||||
if opt.Pull {
|
if opt.Pull {
|
||||||
so.FrontendAttrs["image-resolve-mode"] = "pull"
|
so.FrontendAttrs["image-resolve-mode"] = pb.AttrImageResolveModeForcePull
|
||||||
|
} else if nodeDriver.IsMobyDriver() {
|
||||||
|
// moby driver always resolves local images by default
|
||||||
|
so.FrontendAttrs["image-resolve-mode"] = pb.AttrImageResolveModePreferLocal
|
||||||
}
|
}
|
||||||
if opt.Target != "" {
|
if opt.Target != "" {
|
||||||
so.FrontendAttrs["target"] = opt.Target
|
so.FrontendAttrs["target"] = opt.Target
|
||||||
|
@ -32,6 +32,7 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){
|
|||||||
testBuildLocalExport,
|
testBuildLocalExport,
|
||||||
testBuildRegistryExport,
|
testBuildRegistryExport,
|
||||||
testBuildTarExport,
|
testBuildTarExport,
|
||||||
|
testBuildMobyFromLocalImage,
|
||||||
}
|
}
|
||||||
|
|
||||||
func testBuild(t *testing.T, sb integration.Sandbox) {
|
func testBuild(t *testing.T, sb integration.Sandbox) {
|
||||||
@ -139,6 +140,53 @@ func testImageIDOutput(t *testing.T, sb integration.Sandbox) {
|
|||||||
require.Equal(t, dgst, digest.Digest(md.ConfigDigest))
|
require.Equal(t, dgst, digest.Digest(md.ConfigDigest))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testBuildMobyFromLocalImage(t *testing.T, sb integration.Sandbox) {
|
||||||
|
if !isDockerWorker(sb) {
|
||||||
|
t.Skip("skipping test for non-docker workers")
|
||||||
|
}
|
||||||
|
|
||||||
|
// pull image
|
||||||
|
cmd := dockerCmd(sb, withArgs("pull", "-q", "busybox:latest"))
|
||||||
|
stdout := bytes.NewBuffer(nil)
|
||||||
|
cmd.Stdout = stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
require.NoError(t, cmd.Run())
|
||||||
|
require.Equal(t, "docker.io/library/busybox:latest", strings.TrimSpace(stdout.String()))
|
||||||
|
|
||||||
|
// create local tag
|
||||||
|
cmd = dockerCmd(sb, withArgs("tag", "busybox:latest", "buildx-test:busybox"))
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
require.NoError(t, cmd.Run())
|
||||||
|
|
||||||
|
// build image
|
||||||
|
dockerfile := []byte(`FROM buildx-test:busybox`)
|
||||||
|
dir := tmpdir(t, fstest.CreateFile("Dockerfile", dockerfile, 0600))
|
||||||
|
cmd = buildxCmd(
|
||||||
|
sb,
|
||||||
|
withArgs("build", "-q", "--output=type=cacheonly", dir),
|
||||||
|
)
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
require.NoError(t, cmd.Run())
|
||||||
|
|
||||||
|
// create local tag matching a remote one
|
||||||
|
cmd = dockerCmd(sb, withArgs("tag", "busybox:latest", "busybox:1.36"))
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
require.NoError(t, cmd.Run())
|
||||||
|
|
||||||
|
// build image and check that it uses the local tag
|
||||||
|
dockerfile = []byte(`
|
||||||
|
FROM busybox:1.36
|
||||||
|
RUN busybox | head -1 | grep v1.35.0
|
||||||
|
`)
|
||||||
|
dir = tmpdir(t, fstest.CreateFile("Dockerfile", dockerfile, 0600))
|
||||||
|
cmd = buildxCmd(
|
||||||
|
sb,
|
||||||
|
withArgs("build", "-q", "--output=type=cacheonly", dir),
|
||||||
|
)
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
require.NoError(t, cmd.Run())
|
||||||
|
}
|
||||||
|
|
||||||
func createTestProject(t *testing.T) string {
|
func createTestProject(t *testing.T) string {
|
||||||
dockerfile := []byte(`
|
dockerfile := []byte(`
|
||||||
FROM busybox:latest AS base
|
FROM busybox:latest AS base
|
||||||
|
@ -3,6 +3,7 @@ package tests
|
|||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/containerd/continuity/fs/fstest"
|
"github.com/containerd/continuity/fs/fstest"
|
||||||
@ -55,3 +56,20 @@ func buildxCmd(sb integration.Sandbox, opts ...cmdOpt) *exec.Cmd {
|
|||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dockerCmd(sb integration.Sandbox, opts ...cmdOpt) *exec.Cmd {
|
||||||
|
cmd := exec.Command("docker")
|
||||||
|
cmd.Env = append([]string{}, os.Environ()...)
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(cmd)
|
||||||
|
}
|
||||||
|
if context := sb.DockerAddress(); context != "" {
|
||||||
|
cmd.Env = append(cmd.Env, "DOCKER_CONTEXT="+context)
|
||||||
|
}
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func isDockerWorker(sb integration.Sandbox) bool {
|
||||||
|
sbDriver, _, _ := strings.Cut(sb.Name(), "+")
|
||||||
|
return sbDriver == "docker"
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user