From a51441278afbfde76ac1ec1e01c619fe5733b895 Mon Sep 17 00:00:00 2001 From: Fabio Falci Date: Sat, 15 Feb 2014 00:43:55 +0000 Subject: [PATCH] `docker cp` error when container doesn't exist Fix cp api to return a 404 notfound if container doesn't exist. Fixes #4119. Docker-DCO-1.1-Signed-off-by: Fabio Falci (github: fabiofalci) --- api/api.go | 3 +++ api/client.go | 3 +++ integration/api_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/api/api.go b/api/api.go index 2cfc75631e..2ba27288c0 100644 --- a/api/api.go +++ b/api/api.go @@ -943,6 +943,9 @@ func postContainersCopy(eng *engine.Engine, version float64, w http.ResponseWrit streamJSON(job, w, false) if err := job.Run(); err != nil { utils.Errorf("%s", err.Error()) + if strings.Contains(err.Error(), "No such container") { + w.WriteHeader(http.StatusNotFound) + } } return nil } diff --git a/api/client.go b/api/client.go index f1f336d5f4..61cabc8798 100644 --- a/api/client.go +++ b/api/client.go @@ -1961,6 +1961,9 @@ func (cli *DockerCli) CmdCp(args ...string) error { if stream != nil { defer stream.Close() } + if statusCode == 404 { + return fmt.Errorf("No such container: %v", info[0]) + } if err != nil { return err } diff --git a/integration/api_test.go b/integration/api_test.go index c587f111a2..9756ea1983 100644 --- a/integration/api_test.go +++ b/integration/api_test.go @@ -1217,6 +1217,34 @@ func TestPostContainersCopy(t *testing.T) { } } +func TestPostContainersCopyWhenContainerNotFound(t *testing.T) { + eng := NewTestEngine(t) + defer mkRuntimeFromEngine(eng, t).Nuke() + + r := httptest.NewRecorder() + + var copyData engine.Env + copyData.Set("Resource", "/test.txt") + copyData.Set("HostPath", ".") + + jsonData := bytes.NewBuffer(nil) + if err := copyData.Encode(jsonData); err != nil { + t.Fatal(err) + } + + req, err := http.NewRequest("POST", "/containers/id_not_found/copy", jsonData) + if err != nil { + t.Fatal(err) + } + req.Header.Add("Content-Type", "application/json") + if err := api.ServeRequest(eng, api.APIVERSION, r, req); err != nil { + t.Fatal(err) + } + if r.Code != http.StatusNotFound { + t.Fatalf("404 expected for id_not_found Container, received %v", r.Code) + } +} + // Mocked types for tests type NopConn struct { io.ReadCloser