2017-06-13 120 views
2

我正在嘗試使用Docker REST API部署容器。我能夠創建一個本地圖像並創建一個容器。然而,在啓動容器時,我收到以下錯誤:使用Docker API啓動容器API

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

start請求dockerd日誌是:

 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}" 

發送空請求體後,我得到以下從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" 

搬運工PS對服務器的輸出是:

$ 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 
+0

有什麼不清楚的錯誤信息?請求主體必須是空的。 – Henry

+0

對不起,我錯過了發送錯誤我發送空請求正文。修改上面的問題。 –

+0

這裏有幫助:https://github.com/docker/compose/issues/4039? –

回答

0

我沒有意識到,在創建容器時,我應該傳遞要執行的命令。 Dockerfile具有CMD行,但顯然如果必須使用REST API啓動容器,則必須明確傳遞要執行的命令。

不確定這是否是期望的行爲或Docker引擎中的錯誤。

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\":\"\"}" 
0

對於配置泊塢窗守護程序端口的更多詳細信息,refer configure-docker-daemon-port

一旦泊塢端口配置,您可以訪問泊塢窗的API在遠程主機。

JSON輸入文件:

API來創建容器:

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" 
} 

產生的ID是容器ID和狀態都將無效/運行。

用於啓動創建容器的API。

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

API來檢查狀態/檢查容器:

# 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" 
} 

請參閱本作的詳細信息:

How to build an Image using Docker API?

How to commit Docker Container using API

希望這個信息對他有幫助。

0

我可以重現你已經通過運行下面的命令中規定的問題:

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 

此錯誤消息是相對簡單的。嘗試啓動容器時,我不應該包含任何內容但空的內容。我可以調整命令發送一個空的身體,我可以開始我的容器:

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 

這個問題在這個GitHub的問題,還討論:https://github.com/moby/moby/issues/25667

簡短的回答是確保你在容器創建時傳遞適當的配置,然後在調用端點POST /v1.27/containers/<container>/start時傳遞空的主體。

0

the rapid dashboard中,您可以應用幾個步驟來啓動並記錄容器。

開始迅速UI後

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

您可以鍵入以下步驟來做到這一點:

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 

所有上面的命令可以被轉換爲有效的捲曲命令,以及:

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"