Moby: API gibt nichts zurück, wenn ich die Statistiken des Containers haben möchte

Erstellt am 4. Sept. 2015  ·  3Kommentare  ·  Quelle: moby/moby

Hallo, ich habe ein Problem mit der Docker API, aber zuerst:

$ docker version
Client:
 Version:      1.8.2-rc1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   28220ac
 Built:        Thu Sep  3 19:07:51 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.2-rc1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   28220ac
 Built:        Thu Sep  3 19:07:51 UTC 2015
 OS/Arch:      linux/amd64

$ docker info   
Containers: 17
Images: 8
Storage Driver: devicemapper
 Pool Name: docker-254:0-1512633-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 3.557 GB
 Data Space Total: 107.4 GB
 Data Space Available: 8.216 GB
 Metadata Space Used: 7.848 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.14 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.104 (2015-08-10)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.1.0-1-amd64
Operating System: Debian GNU/Linux stretch/sid
CPUs: 8
Total Memory: 15.65 GiB
Name: n-pc
ID: LWBS:FFUU:5FGD:UXXH:J5FB:G4WL:WUZM:RFS4:3TEC:3IGG:K7GU:YWBV
WARNING: No memory limit support
WARNING: No swap limit support

$ uname -a
Linux n-pc 4.1.0-1-amd64 #1 SMP Debian 4.1.3-1 (2015-08-03) x86_64 GNU/Linux

Ich verwende die API mit der Befehlszeile, und wenn ich die Statistiken eines Containers abrufen möchte, gibt die API nichts zurück:

$ echo -e "GET /containers/57d3/stats?stream=0 HTTP/1.1\r\n" | nc -U /var/run/docker.sock 
HTTP/1.1 200 OK
Content-Type: application/json
Server: Docker/1.8.2-rc1 (linux)
Date: Fri, 04 Sep 2015 08:13:10 GMT
Content-Length: 0

Mit dem Befehl "docker" kann ich die Statistiken abrufen, aber ich muss wirklich die API verwenden:

docker stats --no-stream 57d3
CONTAINER           CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
57d3                 1.16%               0 B/16.81 GB        0.00%               8.565 MB/1.499 MB

Aber die API funktioniert...

echo -e "GET /version HTTP/1.1\r\n" | nc -U /var/run/docker.sock | tail -1 | json
{
    "ApiVersion": "1.20",
    "Arch": "amd64",
    "BuildTime": "Thu Sep  3 19:07:51 UTC 2015",
    "GitCommit": "28220ac",
    "GoVersion": "go1.4.2",
    "KernelVersion": "4.1.0-1-amd64",
    "Os": "linux",
    "Version": "1.8.2-rc1"
}

Was mache ich bitte falsch? Danke schön!

Hilfreichster Kommentar

Ich denke, das ist ein "nc"-Problem. Versuchen Sie es mit: ... nc -q -1 -U /var/run/docker.sock (beachten Sie das "-q -1").

Ich glaube, 'nc' schließt die http-Anfrage, bevor der Server seine Arbeit erledigt, und als Ergebnis stoppen wir die 'Stats'-Verarbeitung. Wenn Sie andere Docker-Cmds ausprobieren, die die HTTP-Anforderung nicht überprüfen, sollten Sie sehen, dass es funktioniert.

Ich werde dies schließen, weil es nicht wirklich ein Docker-Problem ist, sondern ein NC-Problem. Kannst du stattdessen curl verwenden?

Alle 3 Kommentare

Dies geschieht wahrscheinlich, weil Docker zuerst den Antwortheader sendet...
Beachten Sie, dass ich dies nicht mit curl reproduzieren kann, sondern nur mit Paspeln zu nc, wie Sie es hier haben.
Auch die CLI verwendet genau dieselbe API.

Ich denke, das ist ein "nc"-Problem. Versuchen Sie es mit: ... nc -q -1 -U /var/run/docker.sock (beachten Sie das "-q -1").

Ich glaube, 'nc' schließt die http-Anfrage, bevor der Server seine Arbeit erledigt, und als Ergebnis stoppen wir die 'Stats'-Verarbeitung. Wenn Sie andere Docker-Cmds ausprobieren, die die HTTP-Anforderung nicht überprüfen, sollten Sie sehen, dass es funktioniert.

Ich werde dies schließen, weil es nicht wirklich ein Docker-Problem ist, sondern ein NC-Problem. Kannst du stattdessen curl verwenden?

Danke, es funktioniert! aber ich ziehe es vor, -q auf 5 zu setzen (weil -1 für das ewige Warten steht) und 5 setzt ein Timeout auf 5 Sekunden.

Ich kann curl stattdessen unter Debian Stretch verwenden, aber nicht unter Ubuntu 14.04, weil: curl: option --unix-socket: is unknown

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen