mirror of https://github.com/docker/docs.git
				
				
				
			Merge pull request #22149 from vdemeester/deprecated-copy-endpoint
Deprecate /containers/(id or name)/copy endpoint
This commit is contained in:
		
						commit
						148d2b8e4a
					
				| 
						 | 
				
			
			@ -62,7 +62,7 @@ func (r *containerRouter) initRoutes() {
 | 
			
		|||
		router.NewPostRoute("/containers/{name:.*}/wait", r.postContainersWait),
 | 
			
		||||
		router.NewPostRoute("/containers/{name:.*}/resize", r.postContainersResize),
 | 
			
		||||
		router.NewPostRoute("/containers/{name:.*}/attach", r.postContainersAttach),
 | 
			
		||||
		router.NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy),
 | 
			
		||||
		router.NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy), // Deprecated since 1.8, Errors out since 1.12
 | 
			
		||||
		router.NewPostRoute("/containers/{name:.*}/exec", r.postContainerExecCreate),
 | 
			
		||||
		router.NewPostRoute("/exec/{name:.*}/start", r.postContainerExecStart),
 | 
			
		||||
		router.NewPostRoute("/exec/{name:.*}/resize", r.postContainerExecResize),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,11 +11,18 @@ import (
 | 
			
		|||
 | 
			
		||||
	"github.com/docker/docker/api/server/httputils"
 | 
			
		||||
	"github.com/docker/engine-api/types"
 | 
			
		||||
	"github.com/docker/engine-api/types/versions"
 | 
			
		||||
	"golang.org/x/net/context"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// postContainersCopy is deprecated in favor of getContainersArchive.
 | 
			
		||||
func (s *containerRouter) postContainersCopy(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 | 
			
		||||
	// Deprecated since 1.8, Errors out since 1.12
 | 
			
		||||
	version := httputils.VersionFromContext(ctx)
 | 
			
		||||
	if versions.GreaterThanOrEqualTo(version, "1.24") {
 | 
			
		||||
		w.WriteHeader(http.StatusNotFound)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if err := httputils.CheckForJSON(r); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,14 @@ The docker login command is removing the ability to automatically register for a
 | 
			
		|||
 | 
			
		||||
The flag `--security-opt` doesn't use the colon separator(`:`) anymore to divide keys and values, it uses the equal symbol(`=`) for consinstency with other similar flags, like `--storage-opt`.
 | 
			
		||||
 | 
			
		||||
### `/containers/(id or name)/copy` endpoint
 | 
			
		||||
 | 
			
		||||
**Deprecated In Release: v1.8**
 | 
			
		||||
 | 
			
		||||
**Removed In Release: v1.12.0**
 | 
			
		||||
 | 
			
		||||
The endpoint `/containers/(id or name)/copy` is deprecated in favor of `/containers/(id or name)/archive`.
 | 
			
		||||
 | 
			
		||||
### Ambiguous event fields in API
 | 
			
		||||
**Deprecated In Release: [v1.10.0](https://github.com/docker/docker/releases/tag/v1.10.0)**
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -129,6 +129,7 @@ This section lists each version from latest to oldest.  Each listing includes a
 | 
			
		|||
* `POST /containers/(id or name)/start` no longer accepts a `HostConfig`.
 | 
			
		||||
* `POST /images/(name)/tag` no longer has a `force` query parameter.
 | 
			
		||||
* `GET /images/search` now supports maximum returned search results `limit`.
 | 
			
		||||
* `POST /containers/{name:.*}/copy` is now removed and errors out starting from this API version.
 | 
			
		||||
 | 
			
		||||
### v1.23 API changes
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1389,36 +1389,6 @@ Status Codes:
 | 
			
		|||
-   **404** – no such container
 | 
			
		||||
-   **500** – server error
 | 
			
		||||
 | 
			
		||||
### Copy files or folders from a container
 | 
			
		||||
 | 
			
		||||
`POST /containers/(id or name)/copy`
 | 
			
		||||
 | 
			
		||||
Copy files or folders of container `id`
 | 
			
		||||
 | 
			
		||||
**Deprecated** in favor of the `archive` endpoint below.
 | 
			
		||||
 | 
			
		||||
**Example request**:
 | 
			
		||||
 | 
			
		||||
    POST /containers/4fa6e0f0c678/copy HTTP/1.1
 | 
			
		||||
    Content-Type: application/json
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
         "Resource": "test.txt"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
**Example response**:
 | 
			
		||||
 | 
			
		||||
    HTTP/1.1 200 OK
 | 
			
		||||
    Content-Type: application/x-tar
 | 
			
		||||
 | 
			
		||||
    {{ TAR STREAM }}
 | 
			
		||||
 | 
			
		||||
Status Codes:
 | 
			
		||||
 | 
			
		||||
-   **200** – no error
 | 
			
		||||
-   **404** – no such container
 | 
			
		||||
-   **500** – server error
 | 
			
		||||
 | 
			
		||||
### Retrieving information about files and folders in a container
 | 
			
		||||
 | 
			
		||||
`HEAD /containers/(id or name)/archive`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -892,7 +892,7 @@ func (s *DockerSuite) TestContainerApiWait(c *check.C) {
 | 
			
		|||
	c.Assert(waitres.StatusCode, checker.Equals, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyNotExistsAnyMore(c *check.C) {
 | 
			
		||||
	// TODO Windows to Windows CI. This can be ported.
 | 
			
		||||
	testRequires(c, DaemonIsLinux)
 | 
			
		||||
	name := "test-container-api-copy"
 | 
			
		||||
| 
						 | 
				
			
			@ -902,7 +902,22 @@ func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
 | 
			
		|||
		Resource: "/test.txt",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
 | 
			
		||||
	status, _, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
 | 
			
		||||
	c.Assert(err, checker.IsNil)
 | 
			
		||||
	c.Assert(status, checker.Equals, http.StatusNotFound)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyPre124(c *check.C) {
 | 
			
		||||
	// TODO Windows to Windows CI. This can be ported.
 | 
			
		||||
	testRequires(c, DaemonIsLinux)
 | 
			
		||||
	name := "test-container-api-copy"
 | 
			
		||||
	dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt")
 | 
			
		||||
 | 
			
		||||
	postData := types.CopyConfig{
 | 
			
		||||
		Resource: "/test.txt",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
 | 
			
		||||
	c.Assert(err, checker.IsNil)
 | 
			
		||||
	c.Assert(status, checker.Equals, http.StatusOK)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -923,7 +938,7 @@ func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
 | 
			
		|||
	c.Assert(found, checker.True)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) {
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyResourcePathEmptyPr124(c *check.C) {
 | 
			
		||||
	// TODO Windows to Windows CI. This can be ported.
 | 
			
		||||
	testRequires(c, DaemonIsLinux)
 | 
			
		||||
	name := "test-container-api-copy-resource-empty"
 | 
			
		||||
| 
						 | 
				
			
			@ -933,13 +948,13 @@ func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) {
 | 
			
		|||
		Resource: "",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
 | 
			
		||||
	status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
 | 
			
		||||
	c.Assert(err, checker.IsNil)
 | 
			
		||||
	c.Assert(status, checker.Equals, http.StatusInternalServerError)
 | 
			
		||||
	c.Assert(string(body), checker.Matches, "Path cannot be empty\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyResourcePathNotFound(c *check.C) {
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyResourcePathNotFoundPre124(c *check.C) {
 | 
			
		||||
	// TODO Windows to Windows CI. This can be ported.
 | 
			
		||||
	testRequires(c, DaemonIsLinux)
 | 
			
		||||
	name := "test-container-api-copy-resource-not-found"
 | 
			
		||||
| 
						 | 
				
			
			@ -949,18 +964,18 @@ func (s *DockerSuite) TestContainerApiCopyResourcePathNotFound(c *check.C) {
 | 
			
		|||
		Resource: "/notexist",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
 | 
			
		||||
	status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
 | 
			
		||||
	c.Assert(err, checker.IsNil)
 | 
			
		||||
	c.Assert(status, checker.Equals, http.StatusInternalServerError)
 | 
			
		||||
	c.Assert(string(body), checker.Matches, "Could not find the file /notexist in container "+name+"\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyContainerNotFound(c *check.C) {
 | 
			
		||||
func (s *DockerSuite) TestContainerApiCopyContainerNotFoundPr124(c *check.C) {
 | 
			
		||||
	postData := types.CopyConfig{
 | 
			
		||||
		Resource: "/something",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	status, _, err := sockRequest("POST", "/containers/notexists/copy", postData)
 | 
			
		||||
	status, _, err := sockRequest("POST", "/v1.23/containers/notexists/copy", postData)
 | 
			
		||||
	c.Assert(err, checker.IsNil)
 | 
			
		||||
	c.Assert(status, checker.Equals, http.StatusNotFound)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue