github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/cli/e2e/image/build_test.go (about)

     1  package image
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/docker/cli/e2e/internal/fixtures"
    11  	"github.com/docker/cli/internal/test/environment"
    12  	"github.com/docker/cli/internal/test/output"
    13  	"gotest.tools/v3/assert"
    14  	is "gotest.tools/v3/assert/cmp"
    15  	"gotest.tools/v3/fs"
    16  	"gotest.tools/v3/icmd"
    17  	"gotest.tools/v3/skip"
    18  )
    19  
    20  func TestBuildFromContextDirectoryWithTag(t *testing.T) {
    21  	dir := fs.NewDir(t, "test-build-context-dir",
    22  		fs.WithFile("run", "echo running", fs.WithMode(0755)),
    23  		fs.WithDir("data", fs.WithFile("one", "1111")),
    24  		fs.WithFile("Dockerfile", fmt.Sprintf(`
    25  	FROM %s
    26  	COPY run /usr/bin/run
    27  	RUN run
    28  	COPY data /data
    29  		`, fixtures.AlpineImage)))
    30  	defer dir.Remove()
    31  
    32  	result := icmd.RunCmd(
    33  		icmd.Command("docker", "build", "-t", "myimage", "."),
    34  		withWorkingDir(dir))
    35  	defer icmd.RunCommand("docker", "image", "rm", "myimage")
    36  
    37  	result.Assert(t, icmd.Expected{Err: icmd.None})
    38  	output.Assert(t, result.Stdout(), map[int]func(string) error{
    39  		0:  output.Prefix("Sending build context to Docker daemon"),
    40  		1:  output.Suffix("Step 1/4 : FROM registry:5000/alpine:3.6"),
    41  		3:  output.Suffix("Step 2/4 : COPY run /usr/bin/run"),
    42  		5:  output.Suffix("Step 3/4 : RUN run"),
    43  		7:  output.Suffix("running"),
    44  		8:  output.Contains("Removing intermediate container"),
    45  		10: output.Suffix("Step 4/4 : COPY data /data"),
    46  		12: output.Contains("Successfully built "),
    47  		13: output.Suffix("Successfully tagged myimage:latest"),
    48  	})
    49  }
    50  
    51  func TestTrustedBuild(t *testing.T) {
    52  	skip.If(t, environment.RemoteDaemon())
    53  
    54  	dir := fixtures.SetupConfigFile(t)
    55  	defer dir.Remove()
    56  	image1 := fixtures.CreateMaskedTrustedRemoteImage(t, registryPrefix, "trust-build1", "latest")
    57  	image2 := fixtures.CreateMaskedTrustedRemoteImage(t, registryPrefix, "trust-build2", "latest")
    58  
    59  	buildDir := fs.NewDir(t, "test-trusted-build-context-dir",
    60  		fs.WithFile("Dockerfile", fmt.Sprintf(`
    61  	FROM %s as build-base
    62  	RUN echo ok > /foo
    63  	FROM %s
    64  	COPY --from=build-base foo bar
    65  		`, image1, image2)))
    66  	defer buildDir.Remove()
    67  
    68  	result := icmd.RunCmd(
    69  		icmd.Command("docker", "build", "-t", "myimage", "."),
    70  		withWorkingDir(buildDir),
    71  		fixtures.WithConfig(dir.Path()),
    72  		fixtures.WithTrust,
    73  		fixtures.WithNotary,
    74  	)
    75  
    76  	result.Assert(t, icmd.Expected{
    77  		Out: fmt.Sprintf("FROM %s@sha", image1[:len(image1)-7]),
    78  		Err: fmt.Sprintf("Tagging %s@sha", image1[:len(image1)-7]),
    79  	})
    80  	result.Assert(t, icmd.Expected{
    81  		Out: fmt.Sprintf("FROM %s@sha", image2[:len(image2)-7]),
    82  	})
    83  }
    84  
    85  func TestTrustedBuildUntrustedImage(t *testing.T) {
    86  	skip.If(t, environment.RemoteDaemon())
    87  
    88  	dir := fixtures.SetupConfigFile(t)
    89  	defer dir.Remove()
    90  	buildDir := fs.NewDir(t, "test-trusted-build-context-dir",
    91  		fs.WithFile("Dockerfile", fmt.Sprintf(`
    92  	FROM %s
    93  	RUN []
    94  		`, fixtures.AlpineImage)))
    95  	defer buildDir.Remove()
    96  
    97  	result := icmd.RunCmd(
    98  		icmd.Command("docker", "build", "-t", "myimage", "."),
    99  		withWorkingDir(buildDir),
   100  		fixtures.WithConfig(dir.Path()),
   101  		fixtures.WithTrust,
   102  		fixtures.WithNotary,
   103  	)
   104  
   105  	result.Assert(t, icmd.Expected{
   106  		ExitCode: 1,
   107  		Err:      "does not have trust data for",
   108  	})
   109  }
   110  
   111  func TestBuildIidFileSquash(t *testing.T) {
   112  	environment.SkipIfNotExperimentalDaemon(t)
   113  	dir := fs.NewDir(t, "test-iidfile-squash")
   114  	defer dir.Remove()
   115  	iidfile := filepath.Join(dir.Path(), "idsquash")
   116  	buildDir := fs.NewDir(t, "test-iidfile-squash-build",
   117  		fs.WithFile("Dockerfile", fmt.Sprintf(`
   118  	FROM %s
   119  	ENV FOO=FOO
   120  	ENV BAR=BAR
   121  	RUN touch /fiip
   122  	RUN touch /foop`, fixtures.AlpineImage)),
   123  	)
   124  	defer buildDir.Remove()
   125  
   126  	imageTag := "testbuildiidfilesquash"
   127  	result := icmd.RunCmd(
   128  		icmd.Command("docker", "build", "--iidfile", iidfile, "--squash", "-t", imageTag, "."),
   129  		withWorkingDir(buildDir),
   130  	)
   131  	result.Assert(t, icmd.Success)
   132  	id, err := os.ReadFile(iidfile)
   133  	assert.NilError(t, err)
   134  	result = icmd.RunCommand("docker", "image", "inspect", "-f", "{{.Id}}", imageTag)
   135  	result.Assert(t, icmd.Success)
   136  	assert.Check(t, is.Equal(string(id), strings.TrimSpace(result.Combined())))
   137  }
   138  
   139  func withWorkingDir(dir *fs.Dir) func(*icmd.Cmd) {
   140  	return func(cmd *icmd.Cmd) {
   141  		cmd.Dir = dir.Path()
   142  	}
   143  }