如何使用REST API设置Docker容器的名称

时间:2014-10-24 21:11:02

标签: docker

我正在尝试通过REST API创建和启动容器。也就是说,使用以下API:

curl --http1.0 --request POST --header "Content-Type: application.json" http://$DOCKER_HOST:4243/containers/create --data @create.json

其中create.json是所需属性的JSON文件。我想为容器指定一个特定的名称。可以通过docker CLI使用run命令中的--name参数执行此操作:

docker run --name "my_name" my_image

创建容器的文档(https://docs.docker.com/reference/api/docker_remote_api_v1.15/#create-a-container)提供了一个示例JSON有效负载。未列出名称属性。我为名称属性尝试了以下变体:

"Name": "my_name"
"Names": [ "my_name" ]
"Names": [ "/my_name" ]
"Name": "/my_name"

一切都无济于事。变体的灵感来自查询结果:

curl --http1.0 http://$DOCKER_HOST:4243/containers/json

返回包含以下内容的条目:

"Names":["/elegant_mccarthy"]

1 个答案:

答案 0 :(得分:9)

您包含name作为查询参数,而不是JSON。

从文档(在您链接的页面上):

  

查询参数:

     

name - 将指定的名称分配给容器。必须匹配/?[a-zA-Z0-9 _-] +。

所以可能是这样的:

curl --http1.0 --request POST --header "Content-Type: application.json" http://$DOCKER_HOST:4243/containers/create?name=your-name --data @create.json

如有疑问:

您可以使用socat坐在您的Docker CLI调用和它用于与守护程序通信的unix套接字之间,以查看使用docker客户端时发生的确切情况,因为它只是与API本身。

在一个终端:

socat -t100 -v UNIX-LISTEN:/tmp/proxysocket.sock,mode=644,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock

在另一个终端:

export DOCKER_HOST="unix:///tmp/proxysocket.sock"
docker run -ti --name=test ubuntu:14.04 /bin/bash 

您将能够在第一个终端的输出中看到:

  

2014/10/26 02:20:15.176744 length = 564 from = 0 to = 563

     

POST /v1.15/containers/create?name=test HTTP / 1.1 \ r

     

主持人:/tmp/proxysocket.sock \ r

     

User-Agent:Docker-Client / 1.2.0-dev \ r

     

内容长度:370 \ r

     

Content-Type:application / json \ r

     

Accept-Encoding:gzip \ r