|
|
|
@ -46,87 +46,94 @@ func TestBuildCacheADD(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildSixtySteps(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestBuildSixtySteps")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "foobuildsixtysteps", ".")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "foobuildsixtysteps"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext("FROM scratch\n"+strings.Repeat("ADD foo /\n", 60),
|
|
|
|
|
map[string]string{
|
|
|
|
|
"foo": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("foobuildsixtysteps")
|
|
|
|
|
|
|
|
|
|
logDone("build - build an image with sixty build steps")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddSingleFileToRoot(t *testing.T) {
|
|
|
|
|
testDirName := "SingleFileToRoot"
|
|
|
|
|
sourceDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd", testDirName)
|
|
|
|
|
buildDirectory, err := ioutil.TempDir("", "test-build-add")
|
|
|
|
|
defer os.RemoveAll(buildDirectory)
|
|
|
|
|
|
|
|
|
|
err = copyWithCP(sourceDirectory, buildDirectory)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to copy files to temporary directory: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buildDirectory = filepath.Join(buildDirectory, testDirName)
|
|
|
|
|
f, err := os.OpenFile(filepath.Join(buildDirectory, "test_file"), os.O_CREATE, 0644)
|
|
|
|
|
name := "testaddimg"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN touch /exists
|
|
|
|
|
RUN chown dockerio.dockerio /exists
|
|
|
|
|
ADD test_file /
|
|
|
|
|
RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /test_file | awk '{print $1}') = '-rw-r--r--' ]
|
|
|
|
|
RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
f.Close()
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", ".")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add single file to root")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Issue #3960: "ADD src ." hangs
|
|
|
|
|
func TestBuildAddSingleFileToWorkdir(t *testing.T) {
|
|
|
|
|
testDirName := "SingleFileToWorkdir"
|
|
|
|
|
sourceDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd", testDirName)
|
|
|
|
|
buildDirectory, err := ioutil.TempDir("", "test-build-add")
|
|
|
|
|
defer os.RemoveAll(buildDirectory)
|
|
|
|
|
|
|
|
|
|
err = copyWithCP(sourceDirectory, buildDirectory)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to copy files to temporary directory: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buildDirectory = filepath.Join(buildDirectory, testDirName)
|
|
|
|
|
f, err := os.OpenFile(filepath.Join(buildDirectory, "test_file"), os.O_CREATE, 0644)
|
|
|
|
|
name := "testaddsinglefiletoworkdir"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
ADD test_file .`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
f.Close()
|
|
|
|
|
_, exitCode, err := dockerCmdInDirWithTimeout(5*time.Second, buildDirectory, "build", "-t", "testaddimg", ".")
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatalf("build failed: %s", err)
|
|
|
|
|
done := make(chan struct{})
|
|
|
|
|
go func() {
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
close(done)
|
|
|
|
|
}()
|
|
|
|
|
select {
|
|
|
|
|
case <-time.After(5 * time.Second):
|
|
|
|
|
t.Fatal("Build with adding to workdir timed out")
|
|
|
|
|
case <-done:
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add single file to workdir")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddSingleFileToExistDir(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", "SingleFileToExistDir")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "testaddsinglefiletoexistdir"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN mkdir /exists
|
|
|
|
|
RUN touch /exists/exists_file
|
|
|
|
|
RUN chown -R dockerio.dockerio /exists
|
|
|
|
|
ADD test_file /exists/
|
|
|
|
|
RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
|
|
|
|
|
RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add single file to existing dir")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -191,90 +198,117 @@ func TestBuildCopyMultipleFilesToFile(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddSingleFileToNonExistDir(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", "SingleFileToNonExistDir")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "testaddsinglefiletononexistdir"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN touch /exists
|
|
|
|
|
RUN chown dockerio.dockerio /exists
|
|
|
|
|
ADD test_file /test_dir/
|
|
|
|
|
RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add single file to non-existing dir")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddDirContentToRoot(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", "DirContentToRoot")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "testadddircontenttoroot"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN touch /exists
|
|
|
|
|
RUN chown dockerio.dockerio exists
|
|
|
|
|
ADD test_dir /
|
|
|
|
|
RUN [ $(ls -l /test_file | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_dir/test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add directory contents to root")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddDirContentToExistDir(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", "DirContentToExistDir")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "testadddircontenttoexistdir"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN mkdir /exists
|
|
|
|
|
RUN touch /exists/exists_file
|
|
|
|
|
RUN chown -R dockerio.dockerio /exists
|
|
|
|
|
ADD test_dir/ /exists/
|
|
|
|
|
RUN [ $(ls -l / | grep exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
|
|
|
|
|
RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio' ]
|
|
|
|
|
RUN [ $(ls -l /exists/test_file | awk '{print $3":"$4}') = 'root:root' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_dir/test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add directory contents to existing dir")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildAddWholeDirToRoot(t *testing.T) {
|
|
|
|
|
testDirName := "WholeDirToRoot"
|
|
|
|
|
sourceDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd", testDirName)
|
|
|
|
|
buildDirectory, err := ioutil.TempDir("", "test-build-add")
|
|
|
|
|
defer os.RemoveAll(buildDirectory)
|
|
|
|
|
|
|
|
|
|
err = copyWithCP(sourceDirectory, buildDirectory)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to copy files to temporary directory: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buildDirectory = filepath.Join(buildDirectory, testDirName)
|
|
|
|
|
test_dir := filepath.Join(buildDirectory, "test_dir")
|
|
|
|
|
if err := os.MkdirAll(test_dir, 0755); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
f, err := os.OpenFile(filepath.Join(test_dir, "test_file"), os.O_CREATE, 0644)
|
|
|
|
|
name := "testaddwholedirtoroot"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM busybox
|
|
|
|
|
RUN echo 'dockerio:x:1001:1001::/bin:/bin/false' >> /etc/passwd
|
|
|
|
|
RUN echo 'dockerio:x:1001:' >> /etc/group
|
|
|
|
|
RUN touch /exists
|
|
|
|
|
RUN chown dockerio.dockerio exists
|
|
|
|
|
ADD test_dir /test_dir
|
|
|
|
|
RUN [ $(ls -l / | grep test_dir | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l / | grep test_dir | awk '{print $1}') = 'drwxr-xr-x' ]
|
|
|
|
|
RUN [ $(ls -l /test_dir/test_file | awk '{print $3":"$4}') = 'root:root' ]
|
|
|
|
|
RUN [ $(ls -l /test_dir/test_file | awk '{print $1}') = '-rw-r--r--' ]
|
|
|
|
|
RUN [ $(ls -l /exists | awk '{print $3":"$4}') = 'dockerio:dockerio' ]`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"test_dir/test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
f.Close()
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", ".")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
|
|
|
|
|
logDone("build - add whole directory to root")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Testing #5941
|
|
|
|
|
func TestBuildAddEtcToRoot(t *testing.T) {
|
|
|
|
|
buildDirectory := filepath.Join(workingDirectory, "build_tests", "TestAdd")
|
|
|
|
|
out, exitCode, err := dockerCmdInDir(t, buildDirectory, "build", "-t", "testaddimg", "EtcToRoot")
|
|
|
|
|
errorOut(err, t, fmt.Sprintf("build failed to complete: %v %v", out, err))
|
|
|
|
|
|
|
|
|
|
if err != nil || exitCode != 0 {
|
|
|
|
|
t.Fatal("failed to build the image")
|
|
|
|
|
name := "testaddetctoroot"
|
|
|
|
|
defer deleteImages(name)
|
|
|
|
|
ctx, err := fakeContext(`FROM scratch
|
|
|
|
|
ADD . /`,
|
|
|
|
|
map[string]string{
|
|
|
|
|
"etc/test_file": "test1",
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deleteImages("testaddimg")
|
|
|
|
|
logDone("build - add etc directory to root")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|