mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Support whitespaces in ADD and COPY continued
Add tests and documentation for this new feature. Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>
This commit is contained in:
parent
abfb713887
commit
cf455017e0
3 changed files with 99 additions and 14 deletions
|
@ -131,7 +131,11 @@ or
|
|||
interactively, as with the following command: **docker run -t -i image bash**
|
||||
|
||||
**ADD**
|
||||
--**ADD <src>... <dest>** The ADD instruction copies new files, directories
|
||||
--ADD has two forms:
|
||||
**ADD <src>... <dest>**
|
||||
**ADD ["<src>"... "<dest>"]** This form is required for paths containing
|
||||
whitespace.
|
||||
The ADD instruction copies new files, directories
|
||||
or remote file URLs to the filesystem of the container at path <dest>.
|
||||
Mutliple <src> resources may be specified but if they are files or directories
|
||||
then they must be relative to the source directory that is being built
|
||||
|
@ -141,7 +145,11 @@ or
|
|||
and gid of 0.
|
||||
|
||||
**COPY**
|
||||
--**COPY <src> <dest>** The COPY instruction copies new files from <src> and
|
||||
--COPY has two forms:
|
||||
**COPY <src>... <dest>**
|
||||
**COPY ["<src>"... "<dest>"]** This form is required for paths containing
|
||||
whitespace.
|
||||
The COPY instruction copies new files from <src> and
|
||||
adds them to the filesystem of the container at path <dest>. The <src> must be
|
||||
the path to a file or directory relative to the source directory that is
|
||||
being built (the context of the build) or a remote file URL. The `<dest>` is an
|
||||
|
|
|
@ -381,7 +381,11 @@ change them using `docker run --env <key>=<value>`.
|
|||
|
||||
## ADD
|
||||
|
||||
ADD <src>... <dest>
|
||||
ADD has two forms:
|
||||
|
||||
- `ADD <src>... <dest>`
|
||||
- `ADD ["<src>"... "<dest>"]` (this form is required for paths containing
|
||||
whitespace)
|
||||
|
||||
The `ADD` instruction copies new files, directories or remote file URLs from `<src>`
|
||||
and adds them to the filesystem of the container at the path `<dest>`.
|
||||
|
@ -481,7 +485,11 @@ The copy obeys the following rules:
|
|||
|
||||
## COPY
|
||||
|
||||
COPY <src>... <dest>
|
||||
COPY has two forms:
|
||||
|
||||
- `COPY <src>... <dest>`
|
||||
- `COPY ["<src>"... "<dest>"]` (this form is required for paths containing
|
||||
whitespace)
|
||||
|
||||
The `COPY` instruction copies new files or directories from `<src>`
|
||||
and adds them to the filesystem of the container at the path `<dest>`.
|
||||
|
|
|
@ -762,7 +762,7 @@ RUN [ $(ls -l /exists/exists_file | awk '{print $3":"$4}') = 'dockerio:dockerio'
|
|||
if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
logDone("build - mulitple file copy/add tests")
|
||||
logDone("build - multiple file copy/add tests")
|
||||
}
|
||||
|
||||
func TestBuildAddMultipleFilesToFile(t *testing.T) {
|
||||
|
@ -770,7 +770,7 @@ func TestBuildAddMultipleFilesToFile(t *testing.T) {
|
|||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
ADD file1.txt file2.txt test
|
||||
`,
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
|
@ -782,18 +782,41 @@ func TestBuildAddMultipleFilesToFile(t *testing.T) {
|
|||
|
||||
expected := "When using ADD with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain \"%s\") got:\n%v", expected, err)
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple add files to file")
|
||||
}
|
||||
|
||||
func TestBuildJSONAddMultipleFilesToFile(t *testing.T) {
|
||||
name := "testjsonaddmultiplefilestofile"
|
||||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
ADD ["file1.txt", "file2.txt", "test"]
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
})
|
||||
defer ctx.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expected := "When using ADD with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple add files to file json syntax")
|
||||
}
|
||||
|
||||
func TestBuildAddMultipleFilesToFileWild(t *testing.T) {
|
||||
name := "testaddmultiplefilestofilewild"
|
||||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
ADD file*.txt test
|
||||
`,
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
|
@ -805,18 +828,41 @@ func TestBuildAddMultipleFilesToFileWild(t *testing.T) {
|
|||
|
||||
expected := "When using ADD with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain \"%s\") got:\n%v", expected, err)
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple add files to file wild")
|
||||
}
|
||||
|
||||
func TestBuildJSONAddMultipleFilesToFileWild(t *testing.T) {
|
||||
name := "testjsonaddmultiplefilestofilewild"
|
||||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
ADD ["file*.txt", "test"]
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
})
|
||||
defer ctx.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expected := "When using ADD with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple add files to file wild json syntax")
|
||||
}
|
||||
|
||||
func TestBuildCopyMultipleFilesToFile(t *testing.T) {
|
||||
name := "testcopymultiplefilestofile"
|
||||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
COPY file1.txt file2.txt test
|
||||
`,
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
|
@ -828,12 +874,35 @@ func TestBuildCopyMultipleFilesToFile(t *testing.T) {
|
|||
|
||||
expected := "When using COPY with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain \"%s\") got:\n%v", expected, err)
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple copy files to file")
|
||||
}
|
||||
|
||||
func TestBuildJSONCopyMultipleFilesToFile(t *testing.T) {
|
||||
name := "testjsoncopymultiplefilestofile"
|
||||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM scratch
|
||||
COPY ["file1.txt", "file2.txt", "test"]
|
||||
`,
|
||||
map[string]string{
|
||||
"file1.txt": "test1",
|
||||
"file2.txt": "test1",
|
||||
})
|
||||
defer ctx.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expected := "When using COPY with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple copy files to file json syntax")
|
||||
}
|
||||
|
||||
func TestBuildAddFileWithWhitespace(t *testing.T) {
|
||||
name := "testaddfilewithwhitespace"
|
||||
defer deleteImages(name)
|
||||
|
@ -913,7 +982,7 @@ func TestBuildAddMultipleFilesToFileWithWhitespace(t *testing.T) {
|
|||
defer deleteImages(name)
|
||||
ctx, err := fakeContext(`FROM busybox
|
||||
ADD [ "test file1", "test file2", "test" ]
|
||||
`,
|
||||
`,
|
||||
map[string]string{
|
||||
"test file1": "test1",
|
||||
"test file2": "test2",
|
||||
|
@ -925,7 +994,7 @@ func TestBuildAddMultipleFilesToFileWithWhitespace(t *testing.T) {
|
|||
|
||||
expected := "When using ADD with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain \"%s\") got:\n%v", expected, err)
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple add files to file with whitespace")
|
||||
|
@ -948,7 +1017,7 @@ func TestBuildCopyMultipleFilesToFileWithWhitespace(t *testing.T) {
|
|||
|
||||
expected := "When using COPY with more than one source file, the destination must be a directory and end with a /"
|
||||
if _, err := buildImageFromContext(name, ctx, true); err == nil || !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("Wrong error: (should contain \"%s\") got:\n%v", expected, err)
|
||||
t.Fatalf("Wrong error: (should contain %q) got:\n%v", expected, err)
|
||||
}
|
||||
|
||||
logDone("build - multiple copy files to file with whitespace")
|
||||
|
|
Loading…
Reference in a new issue