Pankaj Garg
Pankaj Garg

Reputation: 1013

starting container using docker API

I am trying to deploy a container using Docker REST APIs. I am able to create a local image and create a container. However at the time of starting the container, I am getting the following error:

     {"message":"starting container with non-empty request body was deprecated since v1.10 and removed in v1.12"}

The dockerd logs for the start request is:

     err-code: 400
     time="2017-06-13T07:33:12.679308012Z" level=debug msg="Calling POST /containers/67cf42e1cb92c754ec00a7ec6e02d22ef5ab2267406d7749a85e983481fc0c03/start" 
     time="2017-06-13T07:33:12.679451206Z" level=debug msg="form data: {\"Binds\":[],\"PublishAllPorts\":true}" 

After sending the empty request body, I get the following error logs from dockerd:

    err-code: 404 (no such container - https://docs.docker.com/engine/api/v1.19/#2-endpoints)
    time="2017-06-13T07:54:16.483161021Z" level=debug msg="Calling POST /containers/dbaabc5f437f/start" 
    time="2017-06-13T07:42:34.237522360Z" level=error msg="Create container failed with error: oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"None\\\": executable file not found in $PATH\"\n" 

The output of docker ps on server is:

    $ docker -H=<host-name>:2376 ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    dbaabc5f437f        tomcat:8.0          "None"              7 seconds ago       Created                                 my_tomcat_container_rnixfw

Upvotes: 2

Views: 3590

Answers (4)

Hakan &#214;zler
Hakan &#214;zler

Reputation: 988

In the rapid dashboard, you can apply a few steps to start and log a container.

after starting the rapid ui

$ docker run -d --name rapid  \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -p 8080:8080 \
  ozlerhakan/rapid

You can type the following steps to do so:

POST images/create?fromImage=ubuntu&tag=latest

POST containers/create?name=mycontainer
{
  "Cmd": [
    "date"
  ],
  "Entrypoint": "",
  "Image": "ubuntu"
}

POST containers/mycontainer/start

GET containers/mycontainer/logs?stdout=true&tail=all

All the commands above can be converted to valid cURL commands as well:

curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/images/create?fromImage=ubuntu&tag=latest"

curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/containers/create?name=mycontainer" -H "Content-Type: application/json" -d'
{
  "Cmd": [
    "date"
  ],
  "Entrypoint": "",
  "Image": "ubuntu"
}'

curl --unix-socket /var/run/docker.sock -XPOST "http:/v1.30/containers/mycontainer/start"

GET containers/mycontainer/logs?stdout=true&tail=all

curl --unix-socket /var/run/docker.sock -XGET "http:/v1.30/containers/mycontainer/logs?stdout=true&tail=all"

Upvotes: 1

programmerq
programmerq

Reputation: 6554

I can reproduce the issue you have laid out by running the following command:

curl -v -d "{\"Binds\":[],\"PublishAllPorts\":true}" --unix-socket /var/run/docker.sock http://localhost/v1.27/containers/0df187bd421a/start
*   Trying /var/run/docker.sock...
* Connected to localhost (/var/run/docker.sock) port 80 (#0)
> POST /v1.27/containers/0df187bd421a/start HTTP/1.1
> Host: localhost
> User-Agent: curl/7.53.0
> Accept: */*
> Content-Length: 35
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 35 out of 35 bytes
< HTTP/1.1 400 Bad Request
< Api-Version: 1.29
< Content-Type: application/json
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/17.05.0-ce (linux)
< Date: Tue, 13 Jun 2017 15:57:12 GMT
< Content-Length: 109
<
{"message":"starting container with non-empty request body was deprecated since v1.10 and removed in v1.12"}
* Connection #0 to host localhost left intact

This error message is relatively straightforward. I should not include anything but an empty body when trying to start a container. I can adjust the command to send an empty body, and I am able to start my container:

curl -v -d '' --unix-socket /var/run/docker.sock http://localhost/v1.27/containers/0df187bd421a/start
*   Trying /var/run/docker.sock...
* Connected to localhost (/var/run/docker.sock) port 80 (#0)
> POST /v1.27/containers/0df187bd421a/start HTTP/1.1
> Host: localhost
> User-Agent: curl/7.53.0
> Accept: */*
> Content-Length: 0
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 204 No Content
< Api-Version: 1.29
< Docker-Experimental: false
< Ostype: linux
< Server: Docker/17.05.0-ce (linux)
< Date: Tue, 13 Jun 2017 15:59:20 GMT
<
* Connection #0 to host localhost left intact

This issue is also discussed in this github issue: https://github.com/moby/moby/issues/25667

The short answer is to make sure you pass the appropriate configuration at container create time, and then pass an empty body when you call the POST /v1.27/containers/<container>/start api endpoint.

Upvotes: 0

Here_2_learn
Here_2_learn

Reputation: 5451

For more details on configuring docker daemon port, refer configure-docker-daemon-port

Once the Docker ports are configured, you can access the Docker APIs in the remote host.

JSON input file:

API to create a container:

curl -X POST http://192.168.56.101:6000/containers/create -d @container_create.json --header "Content-Type: application/json" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   602  100    90  100   512   1737   9883 --:--:-- --:--:-- --:--:-- 10039
{
  "Warnings": null,
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940"
}

The ID generated is the container ID and status will not be active/running.

API for starting the created container.

# curl -X POST http://192.168.56.101:6000/containers/f5d3273e48350/start | jq .  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

API to check the status/inspect the container:

# curl -X GET http://192.168.56.101:6000/containers/f5d3273e48350/json | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4076    0  4076    0     0   278k      0 --:--:-- --:--:-- --:--:--  306k
{
  "NetworkSettings": {
    "Networks": {
      "bridge": {
        "MacAddress": "02:42:ac:11:00:03",
        "GlobalIPv6PrefixLen": 0,
        "GlobalIPv6Address": "",
        "IPv6Gateway": "",
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "689d6b65ce1b06c93b2c70f41760a3e7fb2b50697d71cd9c1f39c64c865e5fa6",
        "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16
      }
    },
    "MacAddress": "02:42:ac:11:00:03",
    "SecondaryIPAddresses": null,
    "SandboxKey": "/var/run/docker/netns/24a031d9dfda",
    "Ports": {
      "0/tcp": null
    },
    "LinkLocalIPv6PrefixLen": 0,
    "LinkLocalIPv6Address": "",
    "HairpinMode": false,
    "SandboxID": "24a031d9dfda70026a875f4841269c5e790b12ccafcc11869111faa240020b99",
    "Bridge": "",
    "SecondaryIPv6Addresses": null,
    "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.3",
    "IPPrefixLen": 16,
    "IPv6Gateway": ""
  },

    },
    "AttachStderr": true,
    "AttachStdout": true,
    "AttachStdin": true,
    "User": "",
    "Domainname": "",
    "Hostname": "f5d3273e4835",
    "OpenStdin": true,
    "StdinOnce": true,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "ubuntu:14.04",

<*************REMOVING THE OUTPUT CONTENT********>

  "ExecIDs": null,
  "HostnamePath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hostname",
  "ResolvConfPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/resolv.conf",
  "Image": "sha256:132b7427a3b40f958aaeae8716e0cbb2177658d2410554ed142e583ef522309f",
  "State": {
    "FinishedAt": "0001-01-01T00:00:00Z",
    "StartedAt": "2017-06-09T06:53:45.120357144Z",
    "Error": "",
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,

  "Path": "/bin/bash",
  "Created": "2017-06-09T06:52:51.820429355Z",
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940",
  "HostsPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hosts",
  "LogPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940-json.log",
  "Name": "/objective_bartik",
  "RestartCount": 0,
  "Driver": "aufs",
  "MountLabel": "",
  "ProcessLabel": "",
  "AppArmorProfile": "docker-default"
}

Refer this for more info:

How to build an Image using Docker API?

How to commit Docker Container using API

Hope this info will he helpful.

Upvotes: 0

Pankaj Garg
Pankaj Garg

Reputation: 1013

I didn't realise that while creating the container, I am supposed to pass the command to be executed. The Dockerfile had the CMD line but apparently if one has to start the container using REST API, the command to be executed has to be passed explicitly.

Not sure if this is a desired behaviour or a bug in docker engine.

time="2017-06-13T08:15:22.920664416Z" level=debug msg="Calling POST /containers/create?name=my_tomcat_container_ooztsn" 
time="2017-06-13T08:15:22.920815655Z" level=debug msg="form data: {\"AttachStderr\":true,\"AttachStdin\":true,\"AttachStdout\":true,**\"Cmd\":[\"catalina.sh\",\"run\"]**,\"CpuShares\":null,\"Dns\":null,\"Domainname\":null,\"Entrypoint\":null,\"Env\":null,\"ExposedPorts\":null,\"Hostname\":null,\"Image\":\"tomcat:latest\",\"Memory\":0,\"MemorySwap\":0,\"NetworkDisabled\":false,\"OpenStdin\":true,\"PortBindings\":{},\"PublishAllPorts\":true,\"StdinOnce\":false,\"Tty\":true,\"User\":\"\",\"Volumes\":null,\"VolumesFrom\":null,\"WorkingDir\":\"\"}" 

Upvotes: 0

Related Questions