2014-10-14 17:32:25 -04:00
package main
import (
2015-05-01 18:01:10 -04:00
"archive/tar"
2014-10-14 17:32:25 -04:00
"bytes"
"encoding/json"
2015-07-24 17:12:55 -04:00
"fmt"
2014-10-14 17:32:25 -04:00
"io"
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
"io/ioutil"
2015-04-14 04:00:46 -04:00
"net/http"
2015-05-03 08:54:55 -04:00
"os"
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
"path/filepath"
2015-11-26 07:14:09 -05:00
"regexp"
2015-06-12 12:49:53 -04:00
"strconv"
2014-12-12 11:01:05 -05:00
"strings"
2015-01-19 19:10:26 -05:00
"time"
2015-04-11 17:49:14 -04:00
2016-09-06 14:18:12 -04:00
"github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container"
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
mounttypes "github.com/docker/docker/api/types/mount"
2016-09-06 14:18:12 -04:00
networktypes "github.com/docker/docker/api/types/network"
2017-05-23 23:56:26 -04:00
"github.com/docker/docker/client"
2016-12-30 12:23:00 -05:00
"github.com/docker/docker/integration-cli/checker"
2017-04-11 13:42:54 -04:00
"github.com/docker/docker/integration-cli/cli"
2017-03-23 13:35:22 -04:00
"github.com/docker/docker/integration-cli/cli/build"
2016-12-30 04:49:36 -05:00
"github.com/docker/docker/integration-cli/request"
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/mount"
2015-04-11 17:49:14 -04:00
"github.com/docker/docker/pkg/stringid"
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
"github.com/docker/docker/volume"
2017-05-23 23:56:26 -04:00
"github.com/docker/go-connections/nat"
2015-04-18 12:46:47 -04:00
"github.com/go-check/check"
2017-09-06 19:32:35 -04:00
"github.com/gotestyourself/gotestyourself/poll"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2017-05-23 23:56:26 -04:00
"golang.org/x/net/context"
2014-10-14 17:32:25 -04:00
)
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIGetAll ( c * check . C ) {
2017-01-16 10:39:12 -05:00
startCount := getContainerCount ( c )
2014-10-21 18:48:32 -04:00
name := "getall"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , "true" )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
options := types . ContainerListOptions {
All : true ,
2014-10-21 18:48:32 -04:00
}
2017-05-23 23:56:26 -04:00
containers , err := cli . ContainerList ( context . Background ( ) , options )
c . Assert ( err , checker . IsNil )
c . Assert ( containers , checker . HasLen , startCount + 1 )
actual := containers [ 0 ] . Names [ 0 ]
2015-11-18 19:37:42 -05:00
c . Assert ( actual , checker . Equals , "/" + name )
2014-10-14 17:32:25 -04:00
}
2015-06-03 12:23:14 -04:00
// regression test for empty json field being omitted #13691
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIGetJSONNoFieldsOmitted ( c * check . C ) {
2017-05-23 23:56:26 -04:00
startCount := getContainerCount ( c )
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "busybox" , "true" )
2015-06-03 12:23:14 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
options := types . ContainerListOptions {
All : true ,
}
containers , err := cli . ContainerList ( context . Background ( ) , options )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( containers , checker . HasLen , startCount + 1 )
actual := fmt . Sprintf ( "%+v" , containers [ 0 ] )
fmt . Println ( actual )
2015-06-03 12:23:14 -04:00
// empty Labels field triggered this bug, make sense to check for everything
// cause even Ports for instance can trigger this bug
// better safe than sorry..
fields := [ ] string {
2017-05-23 23:56:26 -04:00
"ID" ,
2015-06-03 12:23:14 -04:00
"Names" ,
"Image" ,
"Command" ,
"Created" ,
"Ports" ,
"Labels" ,
"Status" ,
Add containers’ networks to /containers/json
After addition of multi-host networking in Docker 1.9, Docker Remote
API is still returning only the network specified during creation
of the container in the “List Containers” (`/containers/json`) endpoint:
...
"HostConfig": {
"NetworkMode": "default"
},
The list of networks containers are attached to is only available at
Get Container (`/containers/<id>/json`) endpoint.
This does not allow applications utilizing multi-host networking to
be built on top of Docker Remote API.
Therefore I added a simple `"NetworkSettings"` section to the
`/containers/json` endpoint. This is not identical to the NetworkSettings
returned in Get Container (`/containers/<id>/json`) endpoint. It only
contains a single field `"Networks"`, which is essentially the same
value shown in inspect output of a container.
This change adds the following section to the `/containers/json`:
"NetworkSettings": {
"Networks": {
"bridge": {
"EndpointID": "2cdc4edb1ded3631c81f57966563e...",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
This is of type `SummaryNetworkSettings` type, a minimal version of
`api/types#NetworkSettings`.
Actually all I need is the network name and the IPAddress fields. If folks
find this addition too big, I can create a `SummaryEndpointSettings` field
as well, containing just the IPAddress field.
Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
2015-12-09 23:48:50 -05:00
"NetworkSettings" ,
2015-06-03 12:23:14 -04:00
}
// decoding into types.Container do not work since it eventually unmarshal
// and empty field to an empty go map, so we just check for a string
for _ , f := range fields {
2017-05-23 23:56:26 -04:00
if ! strings . Contains ( actual , f ) {
2015-06-03 12:23:14 -04:00
c . Fatalf ( "Field %s is missing and it shouldn't" , f )
}
}
}
2015-06-12 12:49:53 -04:00
type containerPs struct {
Names [ ] string
2017-05-23 23:56:26 -04:00
Ports [ ] types . Port
2015-06-12 12:49:53 -04:00
}
// regression test for non-empty fields from #13901
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIPsOmitFields ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Problematic for Windows porting due to networking not yet being passed back
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-06-12 12:49:53 -04:00
name := "pstest"
port := 80
2016-01-26 23:16:36 -05:00
runSleepingContainer ( c , "--name" , name , "--expose" , strconv . Itoa ( port ) )
2015-06-12 12:49:53 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-06-12 12:49:53 -04:00
2017-05-23 23:56:26 -04:00
options := types . ContainerListOptions {
All : true ,
}
containers , err := cli . ContainerList ( context . Background ( ) , options )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
var foundContainer containerPs
for _ , c := range containers {
for _ , testName := range c . Names {
2015-06-12 12:49:53 -04:00
if "/" + name == testName {
2017-05-23 23:56:26 -04:00
foundContainer . Names = c . Names
foundContainer . Ports = c . Ports
2015-06-12 12:49:53 -04:00
break
}
}
}
2015-11-18 19:37:42 -05:00
c . Assert ( foundContainer . Ports , checker . HasLen , 1 )
2017-05-23 23:56:26 -04:00
c . Assert ( foundContainer . Ports [ 0 ] . PrivatePort , checker . Equals , uint16 ( port ) )
c . Assert ( foundContainer . Ports [ 0 ] . PublicPort , checker . NotNil )
c . Assert ( foundContainer . Ports [ 0 ] . IP , checker . NotNil )
2015-06-12 12:49:53 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIGetExport ( c * check . C ) {
2016-10-06 20:18:42 -04:00
// Not supported on Windows as Windows does not support docker export
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2014-10-21 18:48:32 -04:00
name := "exportcontainer"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , "touch" , "/test" )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
body , err := cli . ContainerExport ( context . Background ( ) , name )
c . Assert ( err , checker . IsNil )
defer body . Close ( )
2014-10-14 17:32:25 -04:00
found := false
2017-05-23 23:56:26 -04:00
for tarReader := tar . NewReader ( body ) ; ; {
2014-10-14 17:32:25 -04:00
h , err := tarReader . Next ( )
2015-11-18 19:37:42 -05:00
if err != nil && err == io . EOF {
break
2014-10-14 17:32:25 -04:00
}
if h . Name == "test" {
found = true
break
}
}
2015-11-18 19:37:42 -05:00
c . Assert ( found , checker . True , check . Commentf ( "The created test file has not been found in the exported image" ) )
2014-10-14 17:32:25 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIGetChanges ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Not supported on Windows as Windows does not support docker diff (/containers/name/changes)
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2014-10-21 18:48:32 -04:00
name := "changescontainer"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , "rm" , "/etc/passwd" )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2014-10-14 17:32:25 -04:00
2017-05-23 23:56:26 -04:00
changes , err := cli . ContainerDiff ( context . Background ( ) , name )
c . Assert ( err , checker . IsNil )
2014-10-14 17:32:25 -04:00
// Check the changelog for removal of /etc/passwd
success := false
for _ , elem := range changes {
if elem . Path == "/etc/passwd" && elem . Kind == 2 {
success = true
}
}
2015-11-18 19:37:42 -05:00
c . Assert ( success , checker . True , check . Commentf ( "/etc/passwd has been removed but is not present in the diff" ) )
2014-10-14 17:32:25 -04:00
}
2014-12-12 11:01:05 -05:00
2015-04-18 12:46:47 -04:00
func ( s * DockerSuite ) TestGetContainerStats ( c * check . C ) {
2015-01-21 15:14:28 -05:00
var (
2015-07-14 02:35:36 -04:00
name = "statscontainer"
2015-01-21 15:14:28 -05:00
)
2016-09-07 19:08:51 -04:00
runSleepingContainer ( c , "--name" , name )
2015-07-14 02:35:36 -04:00
2015-01-21 15:14:28 -05:00
type b struct {
2017-05-23 23:56:26 -04:00
stats types . ContainerStats
err error
2015-01-21 15:14:28 -05:00
}
2017-05-23 23:56:26 -04:00
2015-01-21 15:14:28 -05:00
bc := make ( chan b , 1 )
2015-01-19 19:10:26 -05:00
go func ( ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
stats , err := cli . ContainerStats ( context . Background ( ) , name , true )
c . Assert ( err , checker . IsNil )
bc <- b { stats , err }
2015-01-19 19:10:26 -05:00
} ( )
2015-01-21 15:14:28 -05:00
// allow some time to stream the stats from the container
time . Sleep ( 4 * time . Second )
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "rm" , "-f" , name )
2015-01-19 19:10:26 -05:00
2015-01-21 15:14:28 -05:00
// collect the results from the stats stream or timeout and fail
// if the stream was not disconnected.
select {
case <- time . After ( 2 * time . Second ) :
2015-04-18 12:46:47 -04:00
c . Fatal ( "stream was not closed after container was removed" )
2015-01-21 15:14:28 -05:00
case sr := <- bc :
2017-05-23 23:56:26 -04:00
dec := json . NewDecoder ( sr . stats . Body )
defer sr . stats . Body . Close ( )
2015-02-24 13:47:47 -05:00
var s * types . Stats
2015-01-21 15:14:28 -05:00
// decode only one object from the stream
2015-11-18 19:37:42 -05:00
c . Assert ( dec . Decode ( & s ) , checker . IsNil )
2015-01-19 19:10:26 -05:00
}
}
2015-01-21 14:08:19 -05:00
2015-05-23 10:09:39 -04:00
func ( s * DockerSuite ) TestGetContainerStatsRmRunning ( c * check . C ) {
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c )
2015-05-26 22:22:03 -04:00
id := strings . TrimSpace ( out )
2017-08-21 18:44:50 -04:00
buf := & ChannelBuffer { C : make ( chan [ ] byte , 1 ) }
2015-05-26 22:22:03 -04:00
defer buf . Close ( )
2016-07-14 19:59:44 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2016-07-14 19:59:44 -04:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
stats , err := cli . ContainerStats ( context . Background ( ) , id , true )
c . Assert ( err , checker . IsNil )
defer stats . Body . Close ( )
2016-07-14 19:59:44 -04:00
2016-01-29 22:27:27 -05:00
chErr := make ( chan error , 1 )
2015-05-26 22:22:03 -04:00
go func ( ) {
2017-05-23 23:56:26 -04:00
_ , err = io . Copy ( buf , stats . Body )
2015-05-26 22:22:03 -04:00
chErr <- err
} ( )
b := make ( [ ] byte , 32 )
// make sure we've got some stats
2016-07-14 19:59:44 -04:00
_ , err = buf . ReadTimeout ( b , 2 * time . Second )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-05-26 22:22:03 -04:00
// Now remove without `-f` and make sure we are still pulling stats
2015-07-27 14:13:25 -04:00
_ , _ , err = dockerCmdWithError ( "rm" , id )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . Not ( checker . IsNil ) , check . Commentf ( "rm should have failed but didn't" ) )
2015-05-26 22:22:03 -04:00
_ , err = buf . ReadTimeout ( b , 2 * time . Second )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-05-26 22:22:03 -04:00
2016-07-14 19:59:44 -04:00
dockerCmd ( c , "rm" , "-f" , id )
c . Assert ( <- chErr , checker . IsNil )
2015-05-26 22:22:03 -04:00
}
2017-08-21 18:44:50 -04:00
// ChannelBuffer holds a chan of byte array that can be populate in a goroutine.
type ChannelBuffer struct {
C chan [ ] byte
}
// Write implements Writer.
func ( c * ChannelBuffer ) Write ( b [ ] byte ) ( int , error ) {
c . C <- b
return len ( b ) , nil
}
// Close closes the go channel.
func ( c * ChannelBuffer ) Close ( ) error {
close ( c . C )
return nil
}
// ReadTimeout reads the content of the channel in the specified byte array with
// the specified duration as timeout.
func ( c * ChannelBuffer ) ReadTimeout ( p [ ] byte , n time . Duration ) ( int , error ) {
select {
case b := <- c . C :
return copy ( p [ 0 : ] , b ) , nil
case <- time . After ( n ) :
return - 1 , fmt . Errorf ( "timeout reading from channel" )
}
}
2015-05-23 10:09:39 -04:00
// regression test for gh13421
// previous test was just checking one stat entry so it didn't fail (stats with
// stream false always return one stat)
func ( s * DockerSuite ) TestGetContainerStatsStream ( c * check . C ) {
name := "statscontainer"
2016-09-07 19:08:51 -04:00
runSleepingContainer ( c , "--name" , name )
2015-05-23 10:09:39 -04:00
type b struct {
2017-05-23 23:56:26 -04:00
stats types . ContainerStats
err error
2015-05-23 10:09:39 -04:00
}
2017-05-23 23:56:26 -04:00
2015-05-23 10:09:39 -04:00
bc := make ( chan b , 1 )
go func ( ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
stats , err := cli . ContainerStats ( context . Background ( ) , name , true )
c . Assert ( err , checker . IsNil )
bc <- b { stats , err }
2015-05-23 10:09:39 -04:00
} ( )
// allow some time to stream the stats from the container
time . Sleep ( 4 * time . Second )
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "rm" , "-f" , name )
2015-05-23 10:09:39 -04:00
// collect the results from the stats stream or timeout and fail
// if the stream was not disconnected.
select {
case <- time . After ( 2 * time . Second ) :
c . Fatal ( "stream was not closed after container was removed" )
case sr := <- bc :
2017-05-23 23:56:26 -04:00
b , err := ioutil . ReadAll ( sr . stats . Body )
defer sr . stats . Body . Close ( )
2017-02-28 11:12:30 -05:00
c . Assert ( err , checker . IsNil )
s := string ( b )
2015-05-23 10:09:39 -04:00
// count occurrences of "read" of types.Stats
if l := strings . Count ( s , "read" ) ; l < 2 {
c . Fatalf ( "Expected more than one stat streamed, got %d" , l )
}
}
}
func ( s * DockerSuite ) TestGetContainerStatsNoStream ( c * check . C ) {
name := "statscontainer"
2016-09-07 19:08:51 -04:00
runSleepingContainer ( c , "--name" , name )
2015-05-23 10:09:39 -04:00
type b struct {
2017-05-23 23:56:26 -04:00
stats types . ContainerStats
err error
2015-05-23 10:09:39 -04:00
}
2017-05-23 23:56:26 -04:00
2015-05-23 10:09:39 -04:00
bc := make ( chan b , 1 )
2017-05-23 23:56:26 -04:00
2015-05-23 10:09:39 -04:00
go func ( ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
stats , err := cli . ContainerStats ( context . Background ( ) , name , false )
c . Assert ( err , checker . IsNil )
bc <- b { stats , err }
2015-05-23 10:09:39 -04:00
} ( )
// allow some time to stream the stats from the container
time . Sleep ( 4 * time . Second )
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "rm" , "-f" , name )
2015-05-23 10:09:39 -04:00
// collect the results from the stats stream or timeout and fail
// if the stream was not disconnected.
select {
case <- time . After ( 2 * time . Second ) :
c . Fatal ( "stream was not closed after container was removed" )
case sr := <- bc :
2017-05-23 23:56:26 -04:00
b , err := ioutil . ReadAll ( sr . stats . Body )
defer sr . stats . Body . Close ( )
c . Assert ( err , checker . IsNil )
s := string ( b )
2016-09-07 19:08:51 -04:00
// count occurrences of `"read"` of types.Stats
c . Assert ( strings . Count ( s , ` "read" ` ) , checker . Equals , 1 , check . Commentf ( "Expected only one stat streamed, got %d" , strings . Count ( s , ` "read" ` ) ) )
2015-05-23 10:09:39 -04:00
}
}
2015-04-18 12:46:47 -04:00
func ( s * DockerSuite ) TestGetStoppedContainerStats ( c * check . C ) {
2015-12-29 23:29:31 -05:00
name := "statscontainer"
2016-09-07 19:08:51 -04:00
dockerCmd ( c , "create" , "--name" , name , "busybox" , "ps" )
2015-03-16 07:55:34 -04:00
2017-05-23 23:56:26 -04:00
chResp := make ( chan error )
2015-12-29 23:29:31 -05:00
// We expect an immediate response, but if it's not immediate, the test would hang, so put it in a goroutine
// below we'll check this on a timeout.
2015-03-16 07:55:34 -04:00
go func ( ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
resp , err := cli . ContainerStats ( context . Background ( ) , name , false )
defer resp . Body . Close ( )
chResp <- err
2015-03-16 07:55:34 -04:00
} ( )
2015-12-29 23:29:31 -05:00
select {
2017-05-23 23:56:26 -04:00
case err := <- chResp :
c . Assert ( err , checker . IsNil )
2015-12-29 23:29:31 -05:00
case <- time . After ( 10 * time . Second ) :
2016-02-22 14:22:20 -05:00
c . Fatal ( "timeout waiting for stats response for stopped container" )
2015-12-29 23:29:31 -05:00
}
2015-03-16 07:55:34 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIPause ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Problematic on Windows as Windows does not support pause
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2017-04-11 13:42:54 -04:00
getPaused := func ( c * check . C ) [ ] string {
return strings . Fields ( cli . DockerCmd ( c , "ps" , "-f" , "status=paused" , "-q" , "-a" ) . Combined ( ) )
}
out := cli . DockerCmd ( c , "run" , "-d" , "busybox" , "sleep" , "30" ) . Combined ( )
2015-04-09 21:14:01 -04:00
ContainerID := strings . TrimSpace ( out )
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerPause ( context . Background ( ) , ContainerID )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-09 21:14:01 -04:00
2017-04-11 13:42:54 -04:00
pausedContainers := getPaused ( c )
2015-04-09 21:14:01 -04:00
if len ( pausedContainers ) != 1 || stringid . TruncateID ( ContainerID ) != pausedContainers [ 0 ] {
2015-04-18 12:46:47 -04:00
c . Fatalf ( "there should be one paused container and not %d" , len ( pausedContainers ) )
2015-04-09 21:14:01 -04:00
}
2017-05-23 23:56:26 -04:00
err = cli . ContainerUnpause ( context . Background ( ) , ContainerID )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-09 21:14:01 -04:00
2017-04-11 13:42:54 -04:00
pausedContainers = getPaused ( c )
2016-12-20 16:26:55 -05:00
c . Assert ( pausedContainers , checker . HasLen , 0 , check . Commentf ( "There should be no paused container." ) )
2015-04-09 21:14:01 -04:00
}
2015-04-14 17:14:29 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPITop ( c * check . C ) {
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-07-14 02:35:36 -04:00
out , _ := dockerCmd ( c , "run" , "-d" , "busybox" , "/bin/sh" , "-c" , "top" )
2015-04-18 12:46:47 -04:00
id := strings . TrimSpace ( string ( out ) )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-04-14 17:14:29 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
top , err := cli . ContainerTop ( context . Background ( ) , id , [ ] string { "aux" } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
c . Assert ( top . Titles , checker . HasLen , 11 , check . Commentf ( "expected 11 titles, found %d: %v" , len ( top . Titles ) , top . Titles ) )
2015-04-14 17:14:29 -04:00
if top . Titles [ 0 ] != "USER" || top . Titles [ 10 ] != "COMMAND" {
2015-04-18 12:46:47 -04:00
c . Fatalf ( "expected `USER` at `Titles[0]` and `COMMAND` at Titles[10]: %v" , top . Titles )
2015-04-14 17:14:29 -04:00
}
2015-11-18 19:37:42 -05:00
c . Assert ( top . Processes , checker . HasLen , 2 , check . Commentf ( "expected 2 processes, found %d: %v" , len ( top . Processes ) , top . Processes ) )
c . Assert ( top . Processes [ 0 ] [ 10 ] , checker . Equals , "/bin/sh -c top" )
c . Assert ( top . Processes [ 1 ] [ 10 ] , checker . Equals , "top" )
2015-04-14 17:14:29 -04:00
}
2015-04-14 20:48:03 -04:00
2016-10-06 20:18:42 -04:00
func ( s * DockerSuite ) TestContainerAPITopWindows ( c * check . C ) {
testRequires ( c , DaemonIsWindows )
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c , "-d" )
2016-10-06 20:18:42 -04:00
id := strings . TrimSpace ( string ( out ) )
c . Assert ( waitRun ( id ) , checker . IsNil )
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
top , err := cli . ContainerTop ( context . Background ( ) , id , nil )
2016-10-06 20:18:42 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( top . Titles , checker . HasLen , 4 , check . Commentf ( "expected 4 titles, found %d: %v" , len ( top . Titles ) , top . Titles ) )
if top . Titles [ 0 ] != "Name" || top . Titles [ 3 ] != "Private Working Set" {
c . Fatalf ( "expected `Name` at `Titles[0]` and `Private Working Set` at Titles[3]: %v" , top . Titles )
}
c . Assert ( len ( top . Processes ) , checker . GreaterOrEqualThan , 2 , check . Commentf ( "expected at least 2 processes, found %d: %v" , len ( top . Processes ) , top . Processes ) )
foundProcess := false
expectedProcess := "busybox.exe"
for _ , process := range top . Processes {
if process [ 0 ] == expectedProcess {
foundProcess = true
break
}
}
c . Assert ( foundProcess , checker . Equals , true , check . Commentf ( "expected to find %s: %v" , expectedProcess , top . Processes ) )
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICommit ( c * check . C ) {
2015-04-25 08:46:47 -04:00
cName := "testapicommit"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name=" + cName , "busybox" , "/bin/sh" , "-c" , "touch /test" )
2015-04-14 20:48:03 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-04-14 20:48:03 -04:00
2017-05-23 23:56:26 -04:00
options := types . ContainerCommitOptions {
Reference : "testcontainerapicommit:testtag" ,
2015-04-14 20:48:03 -04:00
}
2017-05-23 23:56:26 -04:00
img , err := cli . ContainerCommit ( context . Background ( ) , cName , options )
c . Assert ( err , checker . IsNil )
2015-04-14 20:48:03 -04:00
2016-01-28 09:19:25 -05:00
cmd := inspectField ( c , img . ID , "Config.Cmd" )
2016-02-29 06:28:37 -05:00
c . Assert ( cmd , checker . Equals , "[/bin/sh -c touch /test]" , check . Commentf ( "got wrong Cmd from commit: %q" , cmd ) )
2015-11-18 19:37:42 -05:00
2015-04-14 20:48:03 -04:00
// sanity check, make sure the image is what we think it is
2015-07-22 08:59:24 -04:00
dockerCmd ( c , "run" , img . ID , "ls" , "/test" )
2015-05-30 05:31:51 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICommitWithLabelInConfig ( c * check . C ) {
2015-05-30 05:31:51 -04:00
cName := "testapicommitwithconfig"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name=" + cName , "busybox" , "/bin/sh" , "-c" , "touch /test" )
2015-05-30 05:31:51 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-05-30 05:31:51 -04:00
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Labels : map [ string ] string { "key1" : "value1" , "key2" : "value2" } }
options := types . ContainerCommitOptions {
Reference : "testcontainerapicommitwithconfig" ,
Config : & config ,
2015-05-30 05:31:51 -04:00
}
2017-05-23 23:56:26 -04:00
img , err := cli . ContainerCommit ( context . Background ( ) , cName , options )
c . Assert ( err , checker . IsNil )
2015-05-30 05:31:51 -04:00
2016-01-28 09:19:25 -05:00
label1 := inspectFieldMap ( c , img . ID , "Config.Labels" , "key1" )
2015-11-18 19:37:42 -05:00
c . Assert ( label1 , checker . Equals , "value1" )
2015-05-30 05:31:51 -04:00
2016-01-28 09:19:25 -05:00
label2 := inspectFieldMap ( c , img . ID , "Config.Labels" , "key2" )
2015-11-18 19:37:42 -05:00
c . Assert ( label2 , checker . Equals , "value2" )
2015-05-30 05:31:51 -04:00
2016-01-28 09:19:25 -05:00
cmd := inspectField ( c , img . ID , "Config.Cmd" )
2016-02-29 06:28:37 -05:00
c . Assert ( cmd , checker . Equals , "[/bin/sh -c touch /test]" , check . Commentf ( "got wrong Cmd from commit: %q" , cmd ) )
2015-05-30 05:31:51 -04:00
// sanity check, make sure the image is what we think it is
2015-07-22 08:59:24 -04:00
dockerCmd ( c , "run" , img . ID , "ls" , "/test" )
2015-04-14 20:48:03 -04:00
}
2015-04-14 21:04:43 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIBadPort ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// TODO Windows to Windows CI - Port this test
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "/bin/sh" , "-c" , "echo test" } ,
}
hostConfig := containertypes . HostConfig {
PortBindings : nat . PortMap {
"8080/tcp" : [ ] nat . PortBinding {
2015-07-15 23:45:48 -04:00
{
2017-05-23 23:56:26 -04:00
HostIP : "" ,
HostPort : "aa80" } ,
2015-07-15 23:45:48 -04:00
} ,
} ,
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err . Error ( ) , checker . Contains , ` invalid port specification: "aa80" ` )
2015-07-15 23:45:48 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreate ( c * check . C ) {
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "/bin/sh" , "-c" , "touch /test && ls /test" } ,
2015-04-14 21:04:43 -04:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-04-20 17:03:56 -04:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err , checker . IsNil )
2015-04-14 21:04:43 -04:00
2015-07-22 08:59:24 -04:00
out , _ := dockerCmd ( c , "start" , "-a" , container . ID )
2015-11-18 19:37:42 -05:00
c . Assert ( strings . TrimSpace ( out ) , checker . Equals , "/test" )
2015-04-14 21:04:43 -04:00
}
2015-04-14 21:55:04 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateEmptyConfig ( c * check . C ) {
2015-06-06 12:41:42 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-06-06 12:41:42 -04:00
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & containertypes . Config { } , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
expected := "No command specified"
c . Assert ( err . Error ( ) , checker . Contains , expected )
2015-06-06 12:41:42 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateMultipleNetworksConfig ( c * check . C ) {
2016-01-21 17:24:35 -05:00
// Container creation must fail if client specified configurations for more than one network
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
}
networkingConfig := networktypes . NetworkingConfig {
EndpointsConfig : map [ string ] * networktypes . EndpointSettings {
"net1" : { } ,
"net2" : { } ,
"net3" : { } ,
2016-01-21 17:24:35 -05:00
} ,
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2016-01-21 17:24:35 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networkingConfig , "" )
msg := err . Error ( )
2016-01-21 17:24:35 -05:00
// network name order in error message is not deterministic
2016-05-21 07:56:04 -04:00
c . Assert ( msg , checker . Contains , "Container cannot be connected to network endpoints" )
c . Assert ( msg , checker . Contains , "net1" )
c . Assert ( msg , checker . Contains , "net2" )
c . Assert ( msg , checker . Contains , "net3" )
2016-01-21 17:24:35 -05:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateWithHostName ( c * check . C ) {
2015-04-25 04:53:38 -04:00
domainName := "test-domain"
2017-01-02 17:42:45 -05:00
hostName := "test-hostname"
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Hostname : hostName ,
Domainname : domainName ,
2015-04-25 04:53:38 -04:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-04-25 04:53:38 -04:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err , checker . IsNil )
2015-04-25 04:53:38 -04:00
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-25 04:53:38 -04:00
2017-01-02 17:42:45 -05:00
c . Assert ( containerJSON . Config . Hostname , checker . Equals , hostName , check . Commentf ( "Mismatched Hostname" ) )
2015-11-18 19:37:42 -05:00
c . Assert ( containerJSON . Config . Domainname , checker . Equals , domainName , check . Commentf ( "Mismatched Domainname" ) )
2015-04-25 04:53:38 -04:00
}
2015-04-22 07:03:57 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateBridgeNetworkMode ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Windows does not support bridge
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-04-25 04:53:38 -04:00
UtilCreateNetworkMode ( c , "bridge" )
2016-01-07 22:43:11 -05:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateOtherNetworkModes ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Windows does not support these network modes
2016-01-07 22:43:11 -05:00
testRequires ( c , DaemonIsLinux , NotUserNamespace )
UtilCreateNetworkMode ( c , "host" )
2015-04-25 04:53:38 -04:00
UtilCreateNetworkMode ( c , "container:web1" )
}
2015-04-22 07:03:57 -04:00
2017-05-23 23:56:26 -04:00
func UtilCreateNetworkMode ( c * check . C , networkMode containertypes . NetworkMode ) {
config := containertypes . Config {
Image : "busybox" ,
2015-04-22 07:03:57 -04:00
}
2015-04-25 04:53:38 -04:00
2017-05-23 23:56:26 -04:00
hostConfig := containertypes . HostConfig {
NetworkMode : networkMode ,
}
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-04-25 04:53:38 -04:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err , checker . IsNil )
2015-04-22 07:03:57 -04:00
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-25 04:53:38 -04:00
2015-12-18 13:36:17 -05:00
c . Assert ( containerJSON . HostConfig . NetworkMode , checker . Equals , containertypes . NetworkMode ( networkMode ) , check . Commentf ( "Mismatched NetworkMode" ) )
2015-04-22 07:03:57 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateWithCpuSharesCpuset ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// TODO Windows to Windows CI. The CpuShares part could be ported.
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
2015-05-15 17:00:54 -04:00
}
2017-05-23 23:56:26 -04:00
hostConfig := containertypes . HostConfig {
Resources : containertypes . Resources {
CPUShares : 512 ,
CpusetCpus : "0" ,
} ,
}
2015-05-15 17:00:54 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-05-15 17:00:54 -04:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err , checker . IsNil )
2015-05-15 17:00:54 -04:00
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
c . Assert ( err , checker . IsNil )
2015-05-15 17:00:54 -04:00
2016-01-28 09:19:25 -05:00
out := inspectField ( c , containerJSON . ID , "HostConfig.CpuShares" )
2015-11-18 19:37:42 -05:00
c . Assert ( out , checker . Equals , "512" )
2015-05-15 17:00:54 -04:00
2016-01-28 09:19:25 -05:00
outCpuset := inspectField ( c , containerJSON . ID , "HostConfig.CpusetCpus" )
2015-11-18 19:37:42 -05:00
c . Assert ( outCpuset , checker . Equals , "0" )
2015-05-15 17:00:54 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIVerifyHeader ( c * check . C ) {
2015-04-14 21:55:04 -04:00
config := map [ string ] interface { } {
"Image" : "busybox" ,
}
2015-04-27 12:33:08 -04:00
create := func ( ct string ) ( * http . Response , io . ReadCloser , error ) {
2015-04-14 21:55:04 -04:00
jsonData := bytes . NewBuffer ( nil )
2015-11-18 19:37:42 -05:00
c . Assert ( json . NewEncoder ( jsonData ) . Encode ( config ) , checker . IsNil )
2017-03-06 10:35:27 -05:00
return request . Post ( "/containers/create" , request . RawContent ( ioutil . NopCloser ( jsonData ) ) , request . ContentType ( ct ) )
2015-04-14 21:55:04 -04:00
}
// Try with no content-type
2015-04-27 12:33:08 -04:00
res , body , err := create ( "" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2015-04-14 21:55:04 -04:00
body . Close ( )
2015-04-20 17:03:56 -04:00
2015-04-14 21:55:04 -04:00
// Try with wrong content-type
2015-04-27 12:33:08 -04:00
res , body , err = create ( "application/xml" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2015-04-14 21:55:04 -04:00
body . Close ( )
// now application/json
2015-04-27 12:33:08 -04:00
res , body , err = create ( "application/json" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
c . Assert ( res . StatusCode , checker . Equals , http . StatusCreated )
2015-04-14 21:55:04 -04:00
body . Close ( )
}
2015-04-14 22:07:04 -04:00
2015-06-28 06:16:24 -04:00
//Issue 14230. daemon should return 500 for invalid port syntax
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIInvalidPortSyntax ( c * check . C ) {
2015-06-28 06:16:24 -04:00
config := ` {
"Image" : "busybox" ,
"HostConfig" : {
2016-01-23 14:04:57 -05:00
"NetworkMode" : "default" ,
2015-06-28 06:16:24 -04:00
"PortBindings" : {
"19039;1230" : [
{ }
]
}
}
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2015-06-28 06:16:24 -04:00
2017-08-21 18:50:40 -04:00
b , err := request . ReadBody ( body )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2016-06-09 11:32:20 -04:00
c . Assert ( string ( b [ : ] ) , checker . Contains , "invalid port" )
2015-06-28 06:16:24 -04:00
}
2016-12-01 16:24:30 -05:00
func ( s * DockerSuite ) TestContainerAPIRestartPolicyInvalidPolicyName ( c * check . C ) {
2016-06-28 18:33:55 -04:00
config := ` {
"Image" : "busybox" ,
"HostConfig" : {
"RestartPolicy" : {
"Name" : "something" ,
"MaximumRetryCount" : 0
}
}
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2016-06-28 18:33:55 -04:00
2017-08-21 18:50:40 -04:00
b , err := request . ReadBody ( body )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( string ( b [ : ] ) , checker . Contains , "invalid restart policy" )
}
2016-12-01 16:24:30 -05:00
func ( s * DockerSuite ) TestContainerAPIRestartPolicyRetryMismatch ( c * check . C ) {
2016-06-28 18:33:55 -04:00
config := ` {
"Image" : "busybox" ,
"HostConfig" : {
"RestartPolicy" : {
"Name" : "always" ,
"MaximumRetryCount" : 2
}
}
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2016-06-28 18:33:55 -04:00
2017-08-21 18:50:40 -04:00
b , err := request . ReadBody ( body )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
2016-12-01 16:24:30 -05:00
c . Assert ( string ( b [ : ] ) , checker . Contains , "maximum retry count cannot be used with restart policy" )
2016-06-28 18:33:55 -04:00
}
2016-12-01 16:24:30 -05:00
func ( s * DockerSuite ) TestContainerAPIRestartPolicyNegativeRetryCount ( c * check . C ) {
2016-06-28 18:33:55 -04:00
config := ` {
"Image" : "busybox" ,
"HostConfig" : {
"RestartPolicy" : {
"Name" : "on-failure" ,
"MaximumRetryCount" : - 2
}
}
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2016-06-28 18:33:55 -04:00
2017-08-21 18:50:40 -04:00
b , err := request . ReadBody ( body )
2016-06-28 18:33:55 -04:00
c . Assert ( err , checker . IsNil )
2016-12-01 16:24:30 -05:00
c . Assert ( string ( b [ : ] ) , checker . Contains , "maximum retry count cannot be negative" )
}
func ( s * DockerSuite ) TestContainerAPIRestartPolicyDefaultRetryCount ( c * check . C ) {
config := ` {
"Image" : "busybox" ,
"HostConfig" : {
"RestartPolicy" : {
"Name" : "on-failure" ,
"MaximumRetryCount" : 0
}
}
} `
2017-03-06 10:35:27 -05:00
res , _ , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2016-12-01 16:24:30 -05:00
c . Assert ( err , checker . IsNil )
c . Assert ( res . StatusCode , checker . Equals , http . StatusCreated )
2016-06-28 18:33:55 -04:00
}
2015-04-14 22:07:04 -04:00
// Issue 7941 - test to make sure a "null" in JSON is just ignored.
// W/o this fix a null in JSON would be parsed into a string var as "null"
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIPostCreateNull ( c * check . C ) {
2015-04-14 22:07:04 -04:00
config := ` {
"Hostname" : "" ,
"Domainname" : "" ,
"Memory" : 0 ,
"MemorySwap" : 0 ,
"CpuShares" : 0 ,
"Cpuset" : null ,
"AttachStdin" : true ,
"AttachStdout" : true ,
"AttachStderr" : true ,
"ExposedPorts" : { } ,
"Tty" : true ,
"OpenStdin" : true ,
"StdinOnce" : true ,
"Env" : [ ] ,
"Cmd" : "ls" ,
"Image" : "busybox" ,
"Volumes" : { } ,
"WorkingDir" : "" ,
"Entrypoint" : null ,
"NetworkDisabled" : false ,
"OnBuild" : null } `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
c . Assert ( res . StatusCode , checker . Equals , http . StatusCreated )
2015-04-14 22:07:04 -04:00
2017-08-21 18:50:40 -04:00
b , err := request . ReadBody ( body )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-14 22:07:04 -04:00
type createResp struct {
2015-07-22 08:59:24 -04:00
ID string
2015-04-14 22:07:04 -04:00
}
var container createResp
2015-11-18 19:37:42 -05:00
c . Assert ( json . Unmarshal ( b , & container ) , checker . IsNil )
2016-01-28 09:19:25 -05:00
out := inspectField ( c , container . ID , "HostConfig.CpusetCpus" )
2015-11-18 19:37:42 -05:00
c . Assert ( out , checker . Equals , "" )
2015-05-12 02:30:16 -04:00
2016-01-28 09:19:25 -05:00
outMemory := inspectField ( c , container . ID , "HostConfig.Memory" )
2015-11-18 19:37:42 -05:00
c . Assert ( outMemory , checker . Equals , "0" )
2016-01-28 09:19:25 -05:00
outMemorySwap := inspectField ( c , container . ID , "HostConfig.MemorySwap" )
2015-11-18 19:37:42 -05:00
c . Assert ( outMemorySwap , checker . Equals , "0" )
2015-04-14 22:07:04 -04:00
}
2015-04-15 18:43:18 -04:00
2015-04-18 12:46:47 -04:00
func ( s * DockerSuite ) TestCreateWithTooLowMemoryLimit ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// TODO Windows: Port once memory is supported
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-04-15 18:43:18 -04:00
config := ` {
"Image" : "busybox" ,
"Cmd" : "ls" ,
"OpenStdin" : true ,
"CpuShares" : 100 ,
"Memory" : 524287
} `
2017-03-06 10:35:27 -05:00
res , body , err := request . Post ( "/containers/create" , request . RawString ( config ) , request . JSON )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-08-21 18:50:40 -04:00
b , err2 := request . ReadBody ( body )
2015-11-18 19:37:42 -05:00
c . Assert ( err2 , checker . IsNil )
2015-04-15 18:43:18 -04:00
2017-07-19 10:20:13 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2015-11-18 19:37:42 -05:00
c . Assert ( string ( b ) , checker . Contains , "Minimum memory limit allowed is 4MB" )
2015-04-15 18:43:18 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIRename ( c * check . C ) {
out , _ := dockerCmd ( c , "run" , "--name" , "TestContainerAPIRename" , "-d" , "busybox" , "sh" )
2015-04-24 07:57:04 -04:00
containerID := strings . TrimSpace ( out )
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
newName := "TestContainerAPIRenameNew"
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerRename ( context . Background ( ) , containerID , newName )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-24 07:57:04 -04:00
2016-01-28 09:19:25 -05:00
name := inspectField ( c , containerID , "Name" )
2015-11-18 19:37:42 -05:00
c . Assert ( name , checker . Equals , "/" + newName , check . Commentf ( "Failed to rename container" ) )
2015-04-24 07:57:04 -04:00
}
2015-04-29 07:56:45 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIKill ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "test-api-kill"
2016-01-26 23:16:36 -05:00
runSleepingContainer ( c , "-i" , "--name" , name )
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerKill ( context . Background ( ) , name , "SIGKILL" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-29 07:56:45 -04:00
2016-01-28 09:19:25 -05:00
state := inspectField ( c , name , "State.Running" )
2015-11-18 19:37:42 -05:00
c . Assert ( state , checker . Equals , "false" , check . Commentf ( "got wrong State from container %s: %q" , name , state ) )
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIRestart ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "test-api-restart"
2016-10-06 20:18:42 -04:00
runSleepingContainer ( c , "-di" , "--name" , name )
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
timeout := 1 * time . Second
err = cli . ContainerRestart ( context . Background ( ) , name , & timeout )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
2016-10-06 20:18:42 -04:00
c . Assert ( waitInspect ( name , "{{ .State.Restarting }} {{ .State.Running }}" , "false true" , 15 * time . Second ) , checker . IsNil )
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIRestartNotimeoutParam ( c * check . C ) {
2015-05-06 19:49:16 -04:00
name := "test-api-restart-no-timeout-param"
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c , "-di" , "--name" , name )
2015-05-06 19:49:16 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-06 19:49:16 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerRestart ( context . Background ( ) , name , nil )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
2016-10-06 20:18:42 -04:00
c . Assert ( waitInspect ( name , "{{ .State.Restarting }} {{ .State.Running }}" , "false true" , 15 * time . Second ) , checker . IsNil )
2015-05-06 19:49:16 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIStart ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "testing-start"
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : append ( [ ] string { "/bin/sh" , "-c" } , sleepCommandForDaemonPlatform ( ) ... ) ,
OpenStdin : true ,
2015-04-29 07:56:45 -04:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , name )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
err = cli . ContainerStart ( context . Background ( ) , name , types . ContainerStartOptions { } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-29 07:56:45 -04:00
// second call to start should give 304
2017-05-23 23:56:26 -04:00
// maybe add ContainerStartWithRaw to test it
err = cli . ContainerStart ( context . Background ( ) , name , types . ContainerStartOptions { } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2016-02-24 17:59:11 -05:00
// TODO(tibor): figure out why this doesn't work on windows
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIStop ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "test-api-stop"
2016-01-26 23:16:36 -05:00
runSleepingContainer ( c , "-i" , "--name" , name )
2017-05-23 23:56:26 -04:00
timeout := 30 * time . Second
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerStop ( context . Background ( ) , name , & timeout )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2016-01-23 14:04:57 -05:00
c . Assert ( waitInspect ( name , "{{ .State.Running }}" , "false" , 60 * time . Second ) , checker . IsNil )
2015-04-29 07:56:45 -04:00
// second call to start should give 304
2017-05-23 23:56:26 -04:00
// maybe add ContainerStartWithRaw to test it
err = cli . ContainerStop ( context . Background ( ) , name , & timeout )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIWait ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "test-api-wait"
2016-01-26 23:16:36 -05:00
sleepCmd := "/bin/sleep"
2017-01-13 11:23:28 -05:00
if testEnv . DaemonPlatform ( ) == "windows" {
2016-01-26 23:16:36 -05:00
sleepCmd = "sleep"
}
2016-08-03 18:25:27 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , sleepCmd , "2" )
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
2015-04-29 07:56:45 -04:00
2017-05-23 23:56:26 -04:00
waitresC , errC := cli . ContainerWait ( context . Background ( ) , name , "" )
select {
case err = <- errC :
c . Assert ( err , checker . IsNil )
case waitres := <- waitresC :
c . Assert ( waitres . StatusCode , checker . Equals , int64 ( 0 ) )
}
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICopyNotExistsAnyMore ( c * check . C ) {
2015-04-29 07:56:45 -04:00
name := "test-container-api-copy"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , "touch" , "/test.txt" )
2015-04-29 07:56:45 -04:00
postData := types . CopyConfig {
Resource : "/test.txt" ,
}
2017-05-23 23:56:26 -04:00
// no copy in client/
res , _ , err := request . Post ( "/containers/" + name + "/copy" , request . JSONBody ( postData ) )
2016-06-03 13:38:03 -04:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusNotFound )
2016-06-03 13:38:03 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICopyPre124 ( c * check . C ) {
2016-10-31 13:15:43 -04:00
testRequires ( c , DaemonIsLinux ) // Windows only supports 1.25 or later
2016-06-03 13:38:03 -04:00
name := "test-container-api-copy"
dockerCmd ( c , "run" , "--name" , name , "busybox" , "touch" , "/test.txt" )
postData := types . CopyConfig {
Resource : "/test.txt" ,
}
2017-05-23 23:56:26 -04:00
res , body , err := request . Post ( "/v1.23/containers/" + name + "/copy" , request . JSONBody ( postData ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusOK )
2015-04-29 07:56:45 -04:00
found := false
2017-05-23 23:56:26 -04:00
for tarReader := tar . NewReader ( body ) ; ; {
2015-04-29 07:56:45 -04:00
h , err := tarReader . Next ( )
if err != nil {
if err == io . EOF {
break
}
c . Fatal ( err )
}
if h . Name == "test.txt" {
found = true
break
}
}
2015-11-18 19:37:42 -05:00
c . Assert ( found , checker . True )
2015-04-29 07:56:45 -04:00
}
2017-07-19 10:20:13 -04:00
func ( s * DockerSuite ) TestContainerAPICopyResourcePathEmptyPre124 ( c * check . C ) {
2016-10-31 13:15:43 -04:00
testRequires ( c , DaemonIsLinux ) // Windows only supports 1.25 or later
2015-04-29 07:56:45 -04:00
name := "test-container-api-copy-resource-empty"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" , "touch" , "/test.txt" )
2015-04-29 07:56:45 -04:00
postData := types . CopyConfig {
Resource : "" ,
}
2017-05-23 23:56:26 -04:00
res , body , err := request . Post ( "/v1.23/containers/" + name + "/copy" , request . JSONBody ( postData ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
b , err := request . ReadBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( string ( b ) , checker . Matches , "Path cannot be empty\n" )
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICopyResourcePathNotFoundPre124 ( c * check . C ) {
2016-10-31 13:15:43 -04:00
testRequires ( c , DaemonIsLinux ) // Windows only supports 1.25 or later
2015-04-29 07:56:45 -04:00
name := "test-container-api-copy-resource-not-found"
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "run" , "--name" , name , "busybox" )
2015-04-29 07:56:45 -04:00
postData := types . CopyConfig {
Resource : "/notexist" ,
}
2017-05-23 23:56:26 -04:00
res , body , err := request . Post ( "/v1.23/containers/" + name + "/copy" , request . JSONBody ( postData ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusNotFound )
b , err := request . ReadBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( string ( b ) , checker . Matches , "Could not find the file /notexist in container " + name + "\n" )
2015-04-29 07:56:45 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICopyContainerNotFoundPr124 ( c * check . C ) {
2016-10-31 13:15:43 -04:00
testRequires ( c , DaemonIsLinux ) // Windows only supports 1.25 or later
2015-04-29 07:56:45 -04:00
postData := types . CopyConfig {
Resource : "/something" ,
}
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( "/v1.23/containers/notexists/copy" , request . JSONBody ( postData ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusNotFound )
2015-04-29 07:56:45 -04:00
}
2015-05-03 08:54:55 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDelete ( c * check . C ) {
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c )
2015-05-03 08:54:55 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2015-07-14 02:35:36 -04:00
dockerCmd ( c , "stop" , id )
2015-05-03 08:54:55 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , id , types . ContainerRemoveOptions { } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-05-03 08:54:55 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteNotExist ( c * check . C ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , "doesnotexist" , types . ContainerRemoveOptions { } )
c . Assert ( err . Error ( ) , checker . Contains , "No such container: doesnotexist" )
2015-05-03 08:54:55 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteForce ( c * check . C ) {
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c )
2015-05-03 08:54:55 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2017-05-23 23:56:26 -04:00
removeOptions := types . ContainerRemoveOptions {
Force : true ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , id , removeOptions )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-05-03 08:54:55 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteRemoveLinks ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Windows does not support links
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-07-14 02:35:36 -04:00
out , _ := dockerCmd ( c , "run" , "-d" , "--name" , "tlink1" , "busybox" , "top" )
2015-05-03 08:54:55 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2015-07-14 02:35:36 -04:00
out , _ = dockerCmd ( c , "run" , "--link" , "tlink1:tlink1" , "--name" , "tlink2" , "-d" , "busybox" , "top" )
2015-05-03 08:54:55 -04:00
id2 := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id2 ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2016-01-28 09:19:25 -05:00
links := inspectFieldJSON ( c , id2 , "HostConfig.Links" )
2015-11-18 19:37:42 -05:00
c . Assert ( links , checker . Equals , "[\"/tlink1:/tlink2/tlink1\"]" , check . Commentf ( "expected to have links between containers" ) )
2015-05-03 08:54:55 -04:00
2017-05-23 23:56:26 -04:00
removeOptions := types . ContainerRemoveOptions {
RemoveLinks : true ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , "tlink2/tlink1" , removeOptions )
2015-09-03 20:51:04 -04:00
c . Assert ( err , check . IsNil )
2015-05-03 08:54:55 -04:00
2016-01-28 09:19:25 -05:00
linksPostRm := inspectFieldJSON ( c , id2 , "HostConfig.Links" )
2015-11-18 19:37:42 -05:00
c . Assert ( linksPostRm , checker . Equals , "null" , check . Commentf ( "call to api deleteContainer links should have removed the specified links" ) )
2015-05-03 08:54:55 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteConflict ( c * check . C ) {
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c )
2015-05-03 08:54:55 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , id , types . ContainerRemoveOptions { } )
expected := "cannot remove a running container"
c . Assert ( err . Error ( ) , checker . Contains , expected )
2015-05-03 08:54:55 -04:00
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteRemoveVolume ( c * check . C ) {
2015-05-03 08:54:55 -04:00
testRequires ( c , SameHostDaemon )
2016-01-23 14:04:57 -05:00
vol := "/testvolume"
2017-01-13 11:23:28 -05:00
if testEnv . DaemonPlatform ( ) == "windows" {
2016-01-23 14:04:57 -05:00
vol = ` c:\testvolume `
}
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c , "-v" , vol )
2015-05-03 08:54:55 -04:00
id := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( id ) , checker . IsNil )
2015-05-03 08:54:55 -04:00
2016-01-23 14:04:57 -05:00
source , err := inspectMountSourceField ( id , vol )
2015-06-03 15:21:38 -04:00
_ , err = os . Stat ( source )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-05-03 08:54:55 -04:00
2017-05-23 23:56:26 -04:00
removeOptions := types . ContainerRemoveOptions {
Force : true ,
RemoveVolumes : true ,
}
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , id , removeOptions )
c . Assert ( err , check . IsNil )
2015-11-18 19:37:42 -05:00
_ , err = os . Stat ( source )
c . Assert ( os . IsNotExist ( err ) , checker . True , check . Commentf ( "expected to get ErrNotExist error, got %v" , err ) )
2015-05-03 08:54:55 -04:00
}
2015-04-29 13:48:30 -04:00
// Regression test for https://github.com/docker/docker/issues/6231
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIChunkedEncoding ( c * check . C ) {
2015-04-29 13:48:30 -04:00
2016-05-07 06:05:26 -04:00
config := map [ string ] interface { } {
"Image" : "busybox" ,
2016-08-17 18:46:28 -04:00
"Cmd" : append ( [ ] string { "/bin/sh" , "-c" } , sleepCommandForDaemonPlatform ( ) ... ) ,
2016-05-07 06:05:26 -04:00
"OpenStdin" : true ,
}
2017-03-06 10:35:27 -05:00
resp , _ , err := request . Post ( "/containers/create" , request . JSONBody ( config ) , func ( req * http . Request ) error {
2016-12-30 04:49:36 -05:00
// This is a cheat to make the http request do chunked encoding
// Otherwise (just setting the Content-Encoding to chunked) net/http will overwrite
// https://golang.org/src/pkg/net/http/request.go?s=11980:12172
req . ContentLength = - 1
return nil
} )
2016-05-07 06:05:26 -04:00
c . Assert ( err , checker . IsNil , check . Commentf ( "error creating container with chunked encoding" ) )
2017-01-11 15:38:52 -05:00
defer resp . Body . Close ( )
2016-05-07 06:05:26 -04:00
c . Assert ( resp . StatusCode , checker . Equals , http . StatusCreated )
2015-04-29 13:48:30 -04:00
}
2015-04-27 14:55:11 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIPostContainerStop ( c * check . C ) {
2017-04-16 17:39:30 -04:00
out := runSleepingContainer ( c )
2015-04-27 14:55:11 -04:00
containerID := strings . TrimSpace ( out )
2015-11-18 19:37:42 -05:00
c . Assert ( waitRun ( containerID ) , checker . IsNil )
2015-04-27 14:55:11 -04:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
err = cli . ContainerStop ( context . Background ( ) , containerID , nil )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2016-04-11 23:48:00 -04:00
c . Assert ( waitInspect ( containerID , "{{ .State.Running }}" , "false" , 60 * time . Second ) , checker . IsNil )
2015-04-27 14:55:11 -04:00
}
2015-06-26 01:15:57 -04:00
// #14170
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestPostContainerAPICreateWithStringOrSliceEntrypoint ( c * check . C ) {
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Entrypoint : [ ] string { "echo" } ,
Cmd : [ ] string { "hello" , "world" } ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "echotest" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-06-26 01:15:57 -04:00
out , _ := dockerCmd ( c , "start" , "-a" , "echotest" )
2015-11-18 19:37:42 -05:00
c . Assert ( strings . TrimSpace ( out ) , checker . Equals , "hello world" )
2015-06-26 01:15:57 -04:00
config2 := struct {
Image string
2017-05-23 23:56:26 -04:00
Entrypoint string
2015-06-26 01:15:57 -04:00
Cmd [ ] string
2017-05-23 23:56:26 -04:00
} { "busybox" , "echo" , [ ] string { "hello" , "world" } }
_ , _ , err = request . Post ( "/containers/create?name=echotest2" , request . JSONBody ( config2 ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-06-26 01:15:57 -04:00
out , _ = dockerCmd ( c , "start" , "-a" , "echotest2" )
2015-11-18 19:37:42 -05:00
c . Assert ( strings . TrimSpace ( out ) , checker . Equals , "hello world" )
2015-06-26 01:15:57 -04:00
}
// #14170
func ( s * DockerSuite ) TestPostContainersCreateWithStringOrSliceCmd ( c * check . C ) {
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "echo" , "hello" , "world" } ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "echotest" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-06-26 01:15:57 -04:00
out , _ := dockerCmd ( c , "start" , "-a" , "echotest" )
2015-11-18 19:37:42 -05:00
c . Assert ( strings . TrimSpace ( out ) , checker . Equals , "hello world" )
2015-06-26 01:15:57 -04:00
config2 := struct {
2017-05-23 23:56:26 -04:00
Image string
Entrypoint string
Cmd string
} { "busybox" , "echo" , "hello world" }
_ , _ , err = request . Post ( "/containers/create?name=echotest2" , request . JSONBody ( config2 ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-06-26 01:15:57 -04:00
out , _ = dockerCmd ( c , "start" , "-a" , "echotest2" )
2015-11-18 19:37:42 -05:00
c . Assert ( strings . TrimSpace ( out ) , checker . Equals , "hello world" )
2015-06-26 01:15:57 -04:00
}
2015-07-01 13:59:18 -04:00
// regression #14318
func ( s * DockerSuite ) TestPostContainersCreateWithStringOrSliceCapAddDrop ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Windows doesn't support CapAdd/CapDrop
2015-08-28 13:36:42 -04:00
testRequires ( c , DaemonIsLinux )
2015-07-01 13:59:18 -04:00
config := struct {
Image string
CapAdd string
CapDrop string
} { "busybox" , "NET_ADMIN" , "SYS_ADMIN" }
2017-05-23 23:56:26 -04:00
res , _ , err := request . Post ( "/containers/create?name=capaddtest0" , request . JSONBody ( config ) )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusCreated )
2015-07-01 13:59:18 -04:00
2017-05-23 23:56:26 -04:00
config2 := containertypes . Config {
Image : "busybox" ,
}
hostConfig := containertypes . HostConfig {
CapAdd : [ ] string { "NET_ADMIN" , "SYS_ADMIN" } ,
CapDrop : [ ] string { "SETGID" } ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config2 , & hostConfig , & networktypes . NetworkingConfig { } , "capaddtest1" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-07-01 13:59:18 -04:00
}
2015-07-21 15:18:56 -04:00
2015-07-25 07:39:13 -04:00
// #14915
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateNoHostConfig118 ( c * check . C ) {
2016-10-31 13:15:43 -04:00
testRequires ( c , DaemonIsLinux ) // Windows only support 1.25 or later
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
}
var httpClient * http . Client
cli , err := client . NewClient ( daemonHost ( ) , "v1.18" , httpClient , map [ string ] string { } )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-07-25 07:39:13 -04:00
}
2015-07-24 17:12:55 -04:00
// Ensure an error occurs when you have a container read-only rootfs but you
// extract an archive to a symlink in a writable volume which points to a
// directory outside of the volume.
func ( s * DockerSuite ) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Windows does not support read-only rootfs
2015-09-18 13:41:12 -04:00
// Requires local volume mount bind.
// --read-only + userns has remount issues
2016-01-08 16:49:43 -05:00
testRequires ( c , SameHostDaemon , NotUserNamespace , DaemonIsLinux )
2015-07-24 17:12:55 -04:00
testVol := getTestDir ( c , "test-put-container-archive-err-symlink-in-volume-to-read-only-rootfs-" )
defer os . RemoveAll ( testVol )
makeTestContentInDir ( c , testVol )
cID := makeTestContainer ( c , testContainerOptions {
readOnly : true ,
volumes : defaultVolumes ( testVol ) , // Our bind mount is at /vol2
} )
// Attempt to extract to a symlink in the volume which points to a
// directory outside the volume. This should cause an error because the
// rootfs is read-only.
2017-05-23 23:56:26 -04:00
var httpClient * http . Client
cli , err := client . NewClient ( daemonHost ( ) , "v1.20" , httpClient , map [ string ] string { } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2015-07-24 17:12:55 -04:00
2017-05-23 23:56:26 -04:00
err = cli . CopyToContainer ( context . Background ( ) , cID , "/vol2/symlinkToAbsDir" , nil , types . CopyToContainerOptions { } )
c . Assert ( err . Error ( ) , checker . Contains , "container rootfs is marked read-only" )
2015-07-24 17:12:55 -04:00
}
2015-09-18 12:39:14 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIGetContainersJSONEmpty ( c * check . C ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
containers , err := cli . ContainerList ( context . Background ( ) , types . ContainerListOptions { All : true } )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
c . Assert ( containers , checker . HasLen , 0 )
2015-09-18 12:39:14 -04:00
}
2015-09-08 14:40:55 -04:00
func ( s * DockerSuite ) TestPostContainersCreateWithWrongCpusetValues ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Not supported on Windows
2015-09-08 14:40:55 -04:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2015-11-18 19:37:42 -05:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
config := containertypes . Config {
Image : "busybox" ,
}
hostConfig1 := containertypes . HostConfig {
Resources : containertypes . Resources {
CpusetCpus : "1-42,," ,
} ,
}
name := "wrong-cpuset-cpus"
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig1 , & networktypes . NetworkingConfig { } , name )
2016-05-21 07:56:04 -04:00
expected := "Invalid value 1-42,, for cpuset cpus"
2017-05-23 23:56:26 -04:00
c . Assert ( err . Error ( ) , checker . Contains , expected )
2015-09-08 14:40:55 -04:00
2017-05-23 23:56:26 -04:00
hostConfig2 := containertypes . HostConfig {
Resources : containertypes . Resources {
CpusetMems : "42-3,1--" ,
} ,
}
2015-09-08 14:40:55 -04:00
name = "wrong-cpuset-mems"
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig2 , & networktypes . NetworkingConfig { } , name )
2016-05-21 07:56:04 -04:00
expected = "Invalid value 42-3,1-- for cpuset mems"
2017-05-23 23:56:26 -04:00
c . Assert ( err . Error ( ) , checker . Contains , expected )
2015-09-08 14:40:55 -04:00
}
2015-11-30 17:44:34 -05:00
2015-11-26 07:14:09 -05:00
func ( s * DockerSuite ) TestPostContainersCreateShmSizeNegative ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// ShmSize is not supported on Windows
2016-01-08 16:49:43 -05:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
}
hostConfig := containertypes . HostConfig {
ShmSize : - 1 ,
2015-11-26 07:14:09 -05:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "" )
c . Assert ( err . Error ( ) , checker . Contains , "SHM size can not be less than 0" )
2015-11-26 07:14:09 -05:00
}
func ( s * DockerSuite ) TestPostContainersCreateShmSizeHostConfigOmitted ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// ShmSize is not supported on Windows
2016-01-08 16:49:43 -05:00
testRequires ( c , DaemonIsLinux )
2015-12-02 15:43:51 -05:00
var defaultSHMSize int64 = 67108864
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "mount" } ,
2015-11-26 07:14:09 -05:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-11-26 07:14:09 -05:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
2015-11-26 07:14:09 -05:00
c . Assert ( err , check . IsNil )
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
c . Assert ( err , check . IsNil )
2015-11-26 07:14:09 -05:00
2015-12-29 15:49:17 -05:00
c . Assert ( containerJSON . HostConfig . ShmSize , check . Equals , defaultSHMSize )
2015-11-26 07:14:09 -05:00
out , _ := dockerCmd ( c , "start" , "-i" , containerJSON . ID )
shmRegexp := regexp . MustCompile ( ` shm on /dev/shm type tmpfs(.*)size=65536k ` )
if ! shmRegexp . MatchString ( out ) {
c . Fatalf ( "Expected shm of 64MB in mount command, got %v" , out )
}
}
func ( s * DockerSuite ) TestPostContainersCreateShmSizeOmitted ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// ShmSize is not supported on Windows
2016-01-08 16:49:43 -05:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "mount" } ,
2015-11-26 07:14:09 -05:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-11-26 07:14:09 -05:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
2015-11-26 07:14:09 -05:00
c . Assert ( err , check . IsNil )
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
c . Assert ( err , check . IsNil )
2015-11-26 07:14:09 -05:00
2015-12-29 15:49:17 -05:00
c . Assert ( containerJSON . HostConfig . ShmSize , check . Equals , int64 ( 67108864 ) )
2015-11-26 07:14:09 -05:00
out , _ := dockerCmd ( c , "start" , "-i" , containerJSON . ID )
shmRegexp := regexp . MustCompile ( ` shm on /dev/shm type tmpfs(.*)size=65536k ` )
if ! shmRegexp . MatchString ( out ) {
c . Fatalf ( "Expected shm of 64MB in mount command, got %v" , out )
}
}
func ( s * DockerSuite ) TestPostContainersCreateWithShmSize ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// ShmSize is not supported on Windows
2016-01-08 16:49:43 -05:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "mount" } ,
2015-11-26 07:14:09 -05:00
}
2017-05-23 23:56:26 -04:00
hostConfig := containertypes . HostConfig {
ShmSize : 1073741824 ,
}
2015-11-26 07:14:09 -05:00
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-11-26 07:14:09 -05:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "" )
2015-11-26 07:14:09 -05:00
c . Assert ( err , check . IsNil )
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
c . Assert ( err , check . IsNil )
2015-11-26 07:14:09 -05:00
2015-12-29 15:49:17 -05:00
c . Assert ( containerJSON . HostConfig . ShmSize , check . Equals , int64 ( 1073741824 ) )
2015-11-26 07:14:09 -05:00
out , _ := dockerCmd ( c , "start" , "-i" , containerJSON . ID )
shmRegex := regexp . MustCompile ( ` shm on /dev/shm type tmpfs(.*)size=1048576k ` )
if ! shmRegex . MatchString ( out ) {
c . Fatalf ( "Expected shm of 1GB in mount command, got %v" , out )
}
}
func ( s * DockerSuite ) TestPostContainersCreateMemorySwappinessHostConfigOmitted ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// Swappiness is not supported on Windows
2016-01-08 16:49:43 -05:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
2015-11-26 07:14:09 -05:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-11-26 07:14:09 -05:00
2017-05-23 23:56:26 -04:00
container , err := cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , "" )
2015-11-26 07:14:09 -05:00
c . Assert ( err , check . IsNil )
2017-05-23 23:56:26 -04:00
containerJSON , err := cli . ContainerInspect ( context . Background ( ) , container . ID )
c . Assert ( err , check . IsNil )
2015-11-26 07:14:09 -05:00
2017-06-30 13:34:40 -04:00
c . Assert ( containerJSON . HostConfig . MemorySwappiness , check . IsNil )
2015-11-26 07:14:09 -05:00
}
2015-10-13 05:26:27 -04:00
// check validation is done daemon side and not only in cli
func ( s * DockerSuite ) TestPostContainersCreateWithOomScoreAdjInvalidRange ( c * check . C ) {
2016-01-23 14:04:57 -05:00
// OomScoreAdj is not supported on Windows
2015-10-13 05:26:27 -04:00
testRequires ( c , DaemonIsLinux )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
}
hostConfig := containertypes . HostConfig {
OomScoreAdj : 1001 ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
2015-10-13 05:26:27 -04:00
name := "oomscoreadj-over"
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , name )
2016-05-21 07:56:04 -04:00
2016-03-21 20:53:57 -04:00
expected := "Invalid value 1001, range for oom score adj is [-1000, 1000]"
2017-05-23 23:56:26 -04:00
c . Assert ( err . Error ( ) , checker . Contains , expected )
hostConfig = containertypes . HostConfig {
OomScoreAdj : - 1001 ,
2015-10-13 05:26:27 -04:00
}
name = "oomscoreadj-low"
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , name )
2016-03-21 20:53:57 -04:00
expected = "Invalid value -1001, range for oom score adj is [-1000, 1000]"
2017-05-23 23:56:26 -04:00
c . Assert ( err . Error ( ) , checker . Contains , expected )
2015-10-13 05:26:27 -04:00
}
2016-04-20 21:33:53 -04:00
2016-07-03 13:58:11 -04:00
// test case for #22210 where an empty container name caused panic.
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIDeleteWithEmptyName ( c * check . C ) {
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
2016-04-20 21:33:53 -04:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
defer cli . Close ( )
err = cli . ContainerRemove ( context . Background ( ) , "" , types . ContainerRemoveOptions { } )
2017-09-08 12:04:34 -04:00
c . Assert ( err . Error ( ) , checker . Contains , "No such container" )
2016-04-20 21:33:53 -04:00
}
2016-08-20 18:43:15 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPIStatsWithNetworkDisabled ( c * check . C ) {
2016-08-20 18:43:15 -04:00
// Problematic on Windows as Windows does not support stats
testRequires ( c , DaemonIsLinux )
name := "testing-network-disabled"
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "top" } ,
NetworkDisabled : true ,
2016-08-20 18:43:15 -04:00
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & containertypes . HostConfig { } , & networktypes . NetworkingConfig { } , name )
2016-08-20 18:43:15 -04:00
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
err = cli . ContainerStart ( context . Background ( ) , name , types . ContainerStartOptions { } )
2016-08-20 18:43:15 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( waitRun ( name ) , check . IsNil )
type b struct {
2017-05-23 23:56:26 -04:00
stats types . ContainerStats
err error
2016-08-20 18:43:15 -04:00
}
bc := make ( chan b , 1 )
go func ( ) {
2017-05-23 23:56:26 -04:00
stats , err := cli . ContainerStats ( context . Background ( ) , name , false )
bc <- b { stats , err }
2016-08-20 18:43:15 -04:00
} ( )
// allow some time to stream the stats from the container
time . Sleep ( 4 * time . Second )
dockerCmd ( c , "rm" , "-f" , name )
// collect the results from the stats stream or timeout and fail
// if the stream was not disconnected.
select {
case <- time . After ( 2 * time . Second ) :
c . Fatal ( "stream was not closed after container was removed" )
case sr := <- bc :
c . Assert ( sr . err , checker . IsNil )
2017-05-23 23:56:26 -04:00
sr . stats . Body . Close ( )
2016-08-20 18:43:15 -04:00
}
}
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainersAPICreateMountsValidation ( c * check . C ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
type testCase struct {
2017-05-23 23:56:26 -04:00
config containertypes . Config
hostConfig containertypes . HostConfig
msg string
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
prefix , slash := getPrefixAndSlashFromDaemonPlatform ( )
destPath := prefix + slash + "foo"
notExistPath := prefix + slash + "notexist"
cases := [ ] testCase {
2016-09-22 16:14:15 -04:00
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "notreal" ,
Target : destPath ,
} ,
} ,
} ,
msg : "mount type unknown" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "bind" } } } ,
msg : "Target must not be empty" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "bind" ,
Target : destPath } } } ,
msg : "Source must not be empty" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "bind" ,
Source : notExistPath ,
Target : destPath } } } ,
msg : "bind source path does not exist" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "volume" } } } ,
msg : "Target must not be empty" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "volume" ,
Source : "hello" ,
Target : destPath } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "volume" ,
Source : "hello2" ,
Target : destPath ,
VolumeOptions : & mounttypes . VolumeOptions {
DriverConfig : & mounttypes . Driver {
Name : "local" } } } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2016-12-16 09:13:23 -05:00
if SameHostDaemon ( ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
tmpDir , err := ioutils . TempDir ( "" , "test-mounts-api" )
c . Assert ( err , checker . IsNil )
defer os . RemoveAll ( tmpDir )
cases = append ( cases , [ ] testCase {
2016-09-22 16:14:15 -04:00
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "bind" ,
Source : tmpDir ,
Target : destPath } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "bind" ,
Source : tmpDir ,
Target : destPath ,
VolumeOptions : & mounttypes . VolumeOptions { } } } } ,
msg : "VolumeOptions must not be specified" ,
2016-09-22 16:14:15 -04:00
} ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
} ... )
}
2016-12-16 09:13:23 -05:00
if DaemonIsLinux ( ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
cases = append ( cases , [ ] testCase {
2016-09-22 16:14:15 -04:00
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "volume" ,
Source : "hello3" ,
Target : destPath ,
VolumeOptions : & mounttypes . VolumeOptions {
DriverConfig : & mounttypes . Driver {
Name : "local" ,
Options : map [ string ] string { "o" : "size=1" } } } } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "tmpfs" ,
Target : destPath } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "tmpfs" ,
Target : destPath ,
TmpfsOptions : & mounttypes . TmpfsOptions {
SizeBytes : 4096 * 1024 ,
Mode : 0700 ,
} } } } ,
msg : "" ,
2016-09-22 16:14:15 -04:00
} ,
{
2017-05-23 23:56:26 -04:00
config : containertypes . Config {
2016-09-22 16:14:15 -04:00
Image : "busybox" ,
2017-05-23 23:56:26 -04:00
} ,
hostConfig : containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { {
Type : "tmpfs" ,
Source : "/shouldnotbespecified" ,
Target : destPath } } } ,
msg : "Source must not be specified" ,
2016-09-22 16:14:15 -04:00
} ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
} ... )
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
for i , x := range cases {
c . Logf ( "case %d" , i )
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & x . config , & x . hostConfig , & networktypes . NetworkingConfig { } , "" )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
if len ( x . msg ) > 0 {
2017-05-23 23:56:26 -04:00
c . Assert ( err . Error ( ) , checker . Contains , x . msg , check . Commentf ( "%v" , cases [ i ] . config ) )
} else {
c . Assert ( err , checker . IsNil )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
}
}
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainerAPICreateMountsBindRead ( c * check . C ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
testRequires ( c , NotUserNamespace , SameHostDaemon )
// also with data in the host side
prefix , slash := getPrefixAndSlashFromDaemonPlatform ( )
destPath := prefix + slash + "foo"
tmpDir , err := ioutil . TempDir ( "" , "test-mounts-api-bind" )
c . Assert ( err , checker . IsNil )
defer os . RemoveAll ( tmpDir )
err = ioutil . WriteFile ( filepath . Join ( tmpDir , "bar" ) , [ ] byte ( "hello" ) , 666 )
c . Assert ( err , checker . IsNil )
2017-05-23 23:56:26 -04:00
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "/bin/sh" , "-c" , "cat /foo/bar" } ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-05-23 23:56:26 -04:00
hostConfig := containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount {
{ Type : "bind" , Source : tmpDir , Target : destPath } ,
} ,
}
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , "test" )
c . Assert ( err , checker . IsNil )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
out , _ := dockerCmd ( c , "start" , "-a" , "test" )
c . Assert ( out , checker . Equals , "hello" )
}
// Test Mounts comes out as expected for the MountPoint
[nit] integration-cli: obey Go's naming convention
No substantial code change.
- Api --> API
- Cli --> CLI
- Http, Https --> HTTP, HTTPS
- Id --> ID
- Uid,Gid,Pid --> UID,PID,PID
- Ipam --> IPAM
- Tls --> TLS (TestDaemonNoTlsCliTlsVerifyWithEnv --> TestDaemonTLSVerifyIssue13964)
Didn't touch in this commit:
- Git: because it is officially "Git": https://git-scm.com/
- Tar: because it is officially "Tar": https://www.gnu.org/software/tar/
- Cpu, Nat, Mac, Ipc, Shm: for keeping a consistency with existing production code (not changable, for compatibility)
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
2016-09-27 21:50:12 -04:00
func ( s * DockerSuite ) TestContainersAPICreateMountsCreate ( c * check . C ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
prefix , slash := getPrefixAndSlashFromDaemonPlatform ( )
destPath := prefix + slash + "foo"
var (
testImg string
)
2017-01-13 11:23:28 -05:00
if testEnv . DaemonPlatform ( ) != "windows" {
2017-01-16 05:30:14 -05:00
testImg = "test-mount-config"
2017-03-23 13:35:22 -04:00
buildImageSuccessfully ( c , testImg , build . WithDockerfile ( `
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
FROM busybox
RUN mkdir ` +destPath+ ` && touch ` +destPath+slash+ ` bar
CMD cat ` +destPath+slash+ ` bar
2017-01-16 05:30:14 -05:00
` ) )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
} else {
testImg = "busybox"
}
type testCase struct {
cfg mounttypes . Mount
expected types . MountPoint
}
cases := [ ] testCase {
// use literal strings here for `Type` instead of the defined constants in the volume package to keep this honest
// Validation of the actual `Mount` struct is done in another test is not needed here
{ mounttypes . Mount { Type : "volume" , Target : destPath } , types . MountPoint { Driver : volume . DefaultDriverName , Type : "volume" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath + slash } , types . MountPoint { Driver : volume . DefaultDriverName , Type : "volume" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath , Source : "test1" } , types . MountPoint { Type : "volume" , Name : "test1" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath , ReadOnly : true , Source : "test2" } , types . MountPoint { Type : "volume" , Name : "test2" , RW : false , Destination : destPath } } ,
2017-09-06 19:32:35 -04:00
{
mounttypes . Mount {
Type : "volume" ,
Target : destPath ,
Source : "test3" ,
VolumeOptions : & mounttypes . VolumeOptions {
DriverConfig : & mounttypes . Driver { Name : volume . DefaultDriverName } ,
} ,
} ,
types . MountPoint {
Driver : volume . DefaultDriverName ,
Type : "volume" ,
Name : "test3" ,
RW : true ,
Destination : destPath ,
} ,
} ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2016-12-16 09:13:23 -05:00
if SameHostDaemon ( ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
// setup temp dir for testing binds
tmpDir1 , err := ioutil . TempDir ( "" , "test-mounts-api-1" )
c . Assert ( err , checker . IsNil )
defer os . RemoveAll ( tmpDir1 )
cases = append ( cases , [ ] testCase {
2017-09-06 19:32:35 -04:00
{
mounttypes . Mount {
Type : "bind" ,
Source : tmpDir1 ,
Target : destPath ,
} ,
types . MountPoint {
Type : "bind" ,
RW : true ,
Destination : destPath ,
Source : tmpDir1 ,
} ,
} ,
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
{ mounttypes . Mount { Type : "bind" , Source : tmpDir1 , Target : destPath , ReadOnly : true } , types . MountPoint { Type : "bind" , RW : false , Destination : destPath , Source : tmpDir1 } } ,
} ... )
// for modes only supported on Linux
2016-12-16 09:13:23 -05:00
if DaemonIsLinux ( ) {
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
tmpDir3 , err := ioutils . TempDir ( "" , "test-mounts-api-3" )
c . Assert ( err , checker . IsNil )
defer os . RemoveAll ( tmpDir3 )
c . Assert ( mount . Mount ( tmpDir3 , tmpDir3 , "none" , "bind,rw" ) , checker . IsNil )
c . Assert ( mount . ForceMount ( "" , tmpDir3 , "none" , "shared" ) , checker . IsNil )
cases = append ( cases , [ ] testCase {
{ mounttypes . Mount { Type : "bind" , Source : tmpDir3 , Target : destPath } , types . MountPoint { Type : "bind" , RW : true , Destination : destPath , Source : tmpDir3 } } ,
{ mounttypes . Mount { Type : "bind" , Source : tmpDir3 , Target : destPath , ReadOnly : true } , types . MountPoint { Type : "bind" , RW : false , Destination : destPath , Source : tmpDir3 } } ,
{ mounttypes . Mount { Type : "bind" , Source : tmpDir3 , Target : destPath , ReadOnly : true , BindOptions : & mounttypes . BindOptions { Propagation : "shared" } } , types . MountPoint { Type : "bind" , RW : false , Destination : destPath , Source : tmpDir3 , Propagation : "shared" } } ,
} ... )
}
}
2017-01-13 11:23:28 -05:00
if testEnv . DaemonPlatform ( ) != "windows" { // Windows does not support volume populate
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
cases = append ( cases , [ ] testCase {
{ mounttypes . Mount { Type : "volume" , Target : destPath , VolumeOptions : & mounttypes . VolumeOptions { NoCopy : true } } , types . MountPoint { Driver : volume . DefaultDriverName , Type : "volume" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath + slash , VolumeOptions : & mounttypes . VolumeOptions { NoCopy : true } } , types . MountPoint { Driver : volume . DefaultDriverName , Type : "volume" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath , Source : "test4" , VolumeOptions : & mounttypes . VolumeOptions { NoCopy : true } } , types . MountPoint { Type : "volume" , Name : "test4" , RW : true , Destination : destPath } } ,
{ mounttypes . Mount { Type : "volume" , Target : destPath , Source : "test5" , ReadOnly : true , VolumeOptions : & mounttypes . VolumeOptions { NoCopy : true } } , types . MountPoint { Type : "volume" , Name : "test5" , RW : false , Destination : destPath } } ,
} ... )
}
type wrapper struct {
containertypes . Config
HostConfig containertypes . HostConfig
}
type createResp struct {
ID string ` json:"Id" `
}
2017-05-23 23:56:26 -04:00
2017-09-06 19:32:35 -04:00
ctx := context . Background ( )
apiclient := testEnv . APIClient ( )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
for i , x := range cases {
c . Logf ( "case %d - config: %v" , i , x . cfg )
2017-09-06 19:32:35 -04:00
container , err := apiclient . ContainerCreate (
ctx ,
& containertypes . Config { Image : testImg } ,
& containertypes . HostConfig { Mounts : [ ] mounttypes . Mount { x . cfg } } ,
& networktypes . NetworkingConfig { } ,
"" )
require . NoError ( c , err )
containerInspect , err := apiclient . ContainerInspect ( ctx , container . ID )
require . NoError ( c , err )
mps := containerInspect . Mounts
require . Len ( c , mps , 1 )
mountPoint := mps [ 0 ]
if x . expected . Source != "" {
assert . Equal ( c , x . expected . Source , mountPoint . Source )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
if x . expected . Name != "" {
assert . Equal ( c , x . expected . Name , mountPoint . Name )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
if x . expected . Driver != "" {
assert . Equal ( c , x . expected . Driver , mountPoint . Driver )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
if x . expected . Propagation != "" {
assert . Equal ( c , x . expected . Propagation , mountPoint . Propagation )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
assert . Equal ( c , x . expected . RW , mountPoint . RW )
assert . Equal ( c , x . expected . Type , mountPoint . Type )
assert . Equal ( c , x . expected . Mode , mountPoint . Mode )
assert . Equal ( c , x . expected . Destination , mountPoint . Destination )
err = apiclient . ContainerStart ( ctx , container . ID , types . ContainerStartOptions { } )
require . NoError ( c , err )
poll . WaitOn ( c , containerExit ( apiclient , container . ID ) , poll . WithDelay ( time . Second ) )
err = apiclient . ContainerRemove ( ctx , container . ID , types . ContainerRemoveOptions {
RemoveVolumes : true ,
Force : true ,
} )
require . NoError ( c , err )
switch {
// Named volumes still exist after the container is removed
case x . cfg . Type == "volume" && len ( x . cfg . Source ) > 0 :
_ , err := apiclient . VolumeInspect ( ctx , mountPoint . Name )
require . NoError ( c , err )
// Bind mounts are never removed with the container
case x . cfg . Type == "bind" :
// anonymous volumes are removed
default :
_ , err := apiclient . VolumeInspect ( ctx , mountPoint . Name )
assert . True ( c , client . IsErrNotFound ( err ) )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
}
}
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
2017-09-06 19:32:35 -04:00
func containerExit ( apiclient client . APIClient , name string ) func ( poll . LogT ) poll . Result {
return func ( logT poll . LogT ) poll . Result {
container , err := apiclient . ContainerInspect ( context . Background ( ) , name )
if err != nil {
return poll . Error ( err )
}
switch container . State . Status {
case "created" , "running" :
return poll . Continue ( "container %s is %s, waiting for exit" , name , container . State . Status )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
2017-09-06 19:32:35 -04:00
return poll . Success ( )
Add new `HostConfig` field, `Mounts`.
`Mounts` allows users to specify in a much safer way the volumes they
want to use in the container.
This replaces `Binds` and `Volumes`, which both still exist, but
`Mounts` and `Binds`/`Volumes` are exclussive.
The CLI will continue to use `Binds` and `Volumes` due to concerns with
parsing the volume specs on the client side and cross-platform support
(for now).
The new API follows exactly the services mount API.
Example usage of `Mounts`:
```
$ curl -XPOST localhost:2375/containers/create -d '{
"Image": "alpine:latest",
"HostConfig": {
"Mounts": [{
"Type": "Volume",
"Target": "/foo"
},{
"Type": "bind",
"Source": "/var/run/docker.sock",
"Target": "/var/run/docker.sock",
},{
"Type": "volume",
"Name": "important_data",
"Target": "/var/data",
"ReadOnly": true,
"VolumeOptions": {
"DriverConfig": {
Name: "awesomeStorage",
Options: {"size": "10m"},
Labels: {"some":"label"}
}
}]
}
}'
```
There are currently 2 types of mounts:
- **bind**: Paths on the host that get mounted into the
container. Paths must exist prior to creating the container.
- **volume**: Volumes that persist after the
container is removed.
Not all fields are available in each type, and validation is done to
ensure these fields aren't mixed up between types.
Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2016-04-26 14:25:35 -04:00
}
}
2016-09-22 16:14:15 -04:00
func ( s * DockerSuite ) TestContainersAPICreateMountsTmpfs ( c * check . C ) {
testRequires ( c , DaemonIsLinux )
type testCase struct {
2017-05-23 23:56:26 -04:00
cfg mounttypes . Mount
2016-09-22 16:14:15 -04:00
expectedOptions [ ] string
}
target := "/foo"
cases := [ ] testCase {
{
2017-05-23 23:56:26 -04:00
cfg : mounttypes . Mount {
Type : "tmpfs" ,
Target : target } ,
2016-09-22 16:14:15 -04:00
expectedOptions : [ ] string { "rw" , "nosuid" , "nodev" , "noexec" , "relatime" } ,
} ,
{
2017-05-23 23:56:26 -04:00
cfg : mounttypes . Mount {
Type : "tmpfs" ,
Target : target ,
TmpfsOptions : & mounttypes . TmpfsOptions {
SizeBytes : 4096 * 1024 , Mode : 0700 } } ,
2016-09-22 16:14:15 -04:00
expectedOptions : [ ] string { "rw" , "nosuid" , "nodev" , "noexec" , "relatime" , "size=4096k" , "mode=700" } ,
} ,
}
2017-05-23 23:56:26 -04:00
cli , err := client . NewEnvClient ( )
c . Assert ( err , checker . IsNil )
defer cli . Close ( )
config := containertypes . Config {
Image : "busybox" ,
Cmd : [ ] string { "/bin/sh" , "-c" , fmt . Sprintf ( "mount | grep 'tmpfs on %s'" , target ) } ,
}
2016-09-22 16:14:15 -04:00
for i , x := range cases {
cName := fmt . Sprintf ( "test-tmpfs-%d" , i )
2017-05-23 23:56:26 -04:00
hostConfig := containertypes . HostConfig {
Mounts : [ ] mounttypes . Mount { x . cfg } ,
2016-09-22 16:14:15 -04:00
}
2017-05-23 23:56:26 -04:00
_ , err = cli . ContainerCreate ( context . Background ( ) , & config , & hostConfig , & networktypes . NetworkingConfig { } , cName )
c . Assert ( err , checker . IsNil )
2016-09-22 16:14:15 -04:00
out , _ := dockerCmd ( c , "start" , "-a" , cName )
for _ , option := range x . expectedOptions {
c . Assert ( out , checker . Contains , option )
}
}
}
2017-05-22 09:57:39 -04:00
// Regression test for #33334
// Makes sure that when a container which has a custom stop signal + restart=always
// gets killed (with SIGKILL) by the kill API, that the restart policy is cancelled.
func ( s * DockerSuite ) TestContainerKillCustomStopSignal ( c * check . C ) {
id := strings . TrimSpace ( runSleepingContainer ( c , "--stop-signal=SIGTERM" , "--restart=always" ) )
res , _ , err := request . Post ( "/containers/" + id + "/kill" )
c . Assert ( err , checker . IsNil )
defer res . Body . Close ( )
b , err := ioutil . ReadAll ( res . Body )
c . Assert ( res . StatusCode , checker . Equals , http . StatusNoContent , check . Commentf ( string ( b ) ) )
err = waitInspect ( id , "{{.State.Running}} {{.State.Restarting}}" , "false false" , 30 * time . Second )
c . Assert ( err , checker . IsNil )
}