Moby: API ничего не возвращает, когда мне нужна статистика контейнера

Созданный на 4 сент. 2015  ·  3Комментарии  ·  Источник: moby/moby

Здравствуйте, у меня проблема с Docker API, но сначала:

$ 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

Я использую API с командной строкой, и когда я хочу получить статистику контейнера, API ничего не возвращает:

$ 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

С помощью команды «docker» я могу получить статистику, но мне действительно нужно использовать API:

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

Но API работает...

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

Что я делаю неправильно, пожалуйста? Спасибо!

Самый полезный комментарий

Я думаю, что это проблема "NC". Попробуйте: ... nc -q -1 -U /var/run/docker.sock (обратите внимание на «-q -1»).

Я считаю, что «nc» закрывает http-запрос до того, как сервер выполнит свою работу, и в результате мы останавливаем обработку «статистики». Если вы попробуете другие команды docker, которые не проверяют HTTP-запрос, вы увидите, что он работает.

Я закрою это, потому что это не проблема докеров, а проблема NC. Можете ли вы вместо этого использовать curl?

Все 3 Комментарий

Вероятно, это происходит потому, что докер сначала отправляет заголовок ответа...
Обратите внимание, что я не могу воспроизвести это с помощью curl, только с подключением к nc, как здесь.
Также CLI использует точно такой же API.

Я думаю, что это проблема "NC". Попробуйте: ... nc -q -1 -U /var/run/docker.sock (обратите внимание на «-q -1»).

Я считаю, что «nc» закрывает http-запрос до того, как сервер выполнит свою работу, и в результате мы останавливаем обработку «статистики». Если вы попробуете другие команды docker, которые не проверяют HTTP-запрос, вы увидите, что он работает.

Я закрою это, потому что это не проблема докеров, а проблема NC. Можете ли вы вместо этого использовать curl?

Спасибо, это работает! но я предпочитаю установить -q на 5 (потому что -1 означает вечное ожидание), а 5 установит тайм-аут на 5 секунд.

Вместо этого я могу использовать curl в Debian Stretch, но не в Ubuntu 14.04, потому что: curl: option --unix-socket: is unknown

Была ли эта страница полезной?
0 / 5 - 0 рейтинги