如何在现有 docker swarm Python Docker SDK 中创建新服务时在 client.services.create 中添加约束?

问题描述

我想使用 python docker sdk 在现有的 swarm 网络中创建一个服务。我有一个名为 test_net 的群体网络。

安装库:pip3 install docker

下面是用于创建服务的代码

import docker
from docker.types import RestartPolicy,Placement

def python_sdk():
    client = docker.DockerClient(base_url='unix://var/run/docker.sock')
    service_created = client.services.create(
        image='python:3.7-alpine',command='python /home/ubuntu/python.py',constraints=Placement(constraints=['worker']),mounts='/home/ubuntu/deployment/python.py:/home/ubuntu/python.py:rw',networks=['test_net'],restart_policy=RestartPolicy(condition='none'),name='python_sdk'
    )
    print("Created service : ",service_created)

下面是我通过执行上面的代码得到的错误

Traceback (most recent call last):
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/api/client.py",line 268,in _raise_for_status
    response.raise_for_status()
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/requests/models.py",line 943,in raise_for_status
    raise HTTPError(http_error_msg,response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http+docker://localhost/v1.41/services/create

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "client.py",line 20,in <module>
    python_sdk()
  File "client.py",line 16,in python_sdk
    name='python_sdk'
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/models/services.py",line 227,in create
    service_id = self.client.api.create_service(**create_kwargs)
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/utils/decorators.py",line 34,in wrapper
    return f(self,*args,**kwargs)
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/api/service.py",line 190,in create_service
    self._post_json(url,data=data,headers=headers),True
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/api/client.py",line 274,in _result
    self._raise_for_status(response)
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/api/client.py",line 270,in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/home/ubuntu/deployment/dags/venv/lib/python3.6/site-packages/docker/errors.py",line 31,in create_api_error_from_http_exception
    raise cls(e,response=response,explanation=explanation)
docker.errors.APIError: 400 Client Error for http+docker://localhost/v1.41/services/create: Bad Request ("json: cannot unmarshal object into Go struct field Placement.TaskTemplate.Placement.Constraints of type []string")

我指的是 this 文档。

如何使用 Placement 对象来使用约束?

我也试过constraints = ["Placement(constraints=['worker']"]

解决方法

我得到了上述问题的答案。在文档中,提到需要在约束中传递 list of str

提到的参数是文档:constraints (list of str) – Placement constraints.

所以最终的代码是,

import docker
from docker.types import RestartPolicy,Placement

def python_sdk():
    client = docker.DockerClient(base_url='unix://var/run/docker.sock')
    service_created = client.services.create(
        image='python:3.7-alpine',command='python /home/ubuntu/python.py',constraints=['node.role == worker']),mounts='/home/ubuntu/deployment/python.py:/home/ubuntu/python.py:rw',networks=['test_net'],restart_policy=RestartPolicy(condition='none'),name='python_sdk'
    )
    print("Created service : ",service_created)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...