Reputation: 1013
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
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
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
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
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