Skip to content
This repository has been archived by the owner on Oct 13, 2023. It is now read-only.

[17.06] build: fix add from remote url #89

Merged
merged 1 commit into from
Jul 12, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions components/engine/builder/dockerfile/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ type pathCache interface {
// copyInfo is a data object which stores the metadata about each source file in
// a copyInstruction
type copyInfo struct {
root string
path string
hash string
root string
path string
hash string
noDecompress bool
}

func newCopyInfoFromSource(source builder.Source, path string, hash string) copyInfo {
Expand Down Expand Up @@ -118,7 +119,9 @@ func (o *copier) getCopyInfoForSourcePath(orig string) ([]copyInfo, error) {
o.tmpPaths = append(o.tmpPaths, remote.Root())

hash, err := remote.Hash(path)
return newCopyInfos(newCopyInfoFromSource(remote, path, hash)), err
ci := newCopyInfoFromSource(remote, path, hash)
ci.noDecompress = true // data from http shouldn't be extracted even on ADD
return newCopyInfos(ci), err
}

// Cleanup removes any temporary directories created as part of downloading
Expand Down
5 changes: 5 additions & 0 deletions components/engine/builder/dockerfile/dispatchers.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@ func add(req dispatchRequest) error {
return err
}
copyInstruction.allowLocalDecompression = true
for _, ci := range copyInstruction.infos {
if ci.noDecompress {
copyInstruction.allowLocalDecompression = false
}
}

return req.builder.performCopy(req.state, copyInstruction)
}
Expand Down
45 changes: 45 additions & 0 deletions components/engine/integration-cli/docker_api_build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"archive/tar"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"regexp"
Expand Down Expand Up @@ -322,6 +323,50 @@ func (s *DockerSuite) TestBuildOnBuildCache(c *check.C) {
assert.Equal(c, parentID, image.Parent)
}

func (s *DockerSuite) TestBuildAddRemoteNoDecompress(c *check.C) {
buffer := new(bytes.Buffer)
tw := tar.NewWriter(buffer)
dt := []byte("contents")
err := tw.WriteHeader(&tar.Header{
Name: "foo",
Size: int64(len(dt)),
Mode: 0600,
Typeflag: tar.TypeReg,
})
require.NoError(c, err)
_, err = tw.Write(dt)
require.NoError(c, err)
err = tw.Close()
require.NoError(c, err)

server := fakestorage.New(c, "", fakecontext.WithBinaryFiles(map[string]*bytes.Buffer{
"test.tar": buffer,
}))
defer server.Close()

dockerfile := fmt.Sprintf(`
FROM busybox
ADD %s/test.tar /
RUN [ -f test.tar ]
`, server.URL())

ctx := fakecontext.New(c, "",
fakecontext.WithDockerfile(dockerfile),
)
defer ctx.Close()

res, body, err := request.Post(
"/build",
request.RawContent(ctx.AsTarReader(c)),
request.ContentType("application/x-tar"))
require.NoError(c, err)
assert.Equal(c, http.StatusOK, res.StatusCode)

out, err := testutil.ReadBody(body)
require.NoError(c, err)
assert.Contains(c, string(out), "Successfully built")
}

type buildLine struct {
Stream string
Aux struct {
Expand Down