docker API接口service update错误记录

问题

创建srvice的参数的时候,如果设置了network参数(接口POST:service/create)

[{
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 3,
  "Command": [],
  "ContainerEnv": [],
  "PortConfig": [
    {
      "Protocol": "tcp",
      "TargetPort": 80,
      "PublishedPort": 8081
    }
  ],
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ],
  "UpdateConfig": {
    "Parallelism": 1,
    "Delay": 10000000000,
    "FailureAction": "",
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": null
  },
  "RollbackConfig": {
    "Parallelism": null,
    "Delay": null,
    "FailureAction": null,
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": ""
  },
  "RestartPolicy": {
    "Condition": null,
    "Delay": null,
    "MaxAttempts": null
  },
  "WarehouseUrl": null,
  "WarehousePwd": null,
  "WarehouseUserName": null,
  "Mount": []
}]

而更新的时候,没有传network参数,会报错:error while removing network:…

更新service参数如下:(接口PUT:/service/update)

{
  "ServiceId": "itnl2vrkixib9hlgtmsuj4awu",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2
}

同时,因为端口等其他参数也没传,造成更新之后,端口啥的都消失了,截图如下:

1. 创建service的时候

2. 更新service之后

 分析错误原因

先不考虑端口等其他问题,先分析造成network错误的原因,上面是创建service的时候设置了network参数,下面对应几个更新service的时候传不同参数的结果

1. 更新的时候 network不变,相当于不更改network,更改副本数

(1)只传部分参数,报错

{ // 更新的时候传的参数
  "ServiceId": "9t2jucsc3t1i0t9bx2n7csmjf",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ]
}

(2)、全量传参,不报错

{
  "ServiceId": "i8cdkcbb4o9ly0nczqlgt5l3l",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Command": [],
  "ContainerEnv": [],
  "PortConfig": [
    {
      "Protocol": "tcp",
      "TargetPort": 80,
      "PublishedPort": 8082
    }
  ],
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ],
  "UpdateConfig": {
    "Parallelism": 1,
    "Delay": 10000000000,
    "FailureAction": "",
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": null
  },
  "RollbackConfig": {
    "Parallelism": null,
    "Delay": 10000000000,
    "FailureAction": null,
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": ""
  },
  "RestartPolicy": {
    "Condition": null,
    "Delay": null,
    "MaxAttempts": null
  },
  "WarehouseUrl": null,
  "WarehousePwd": null,
  "WarehouseUserName": null,
  "Mount": []
}

2. 更新的时候,不传network参数,相当于移除network

(1)部分传参,报错

{
  "ServiceId": "tx8882z81lh834uenw4tcgt48",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2
}

(2)、全量传参,不报错(参数太多,博客省略部分,实际传参的时候有)

{
  "ServiceId": "uvknv24zb8q2iouoz9lv5v13n",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Command": [],
  "ContainerEnv": [],
  "PortConfig": [
    {
      "Protocol": "tcp",
      "TargetPort": 80,
      "PublishedPort": 8082
    }
  ],
  ....省略
}

3. 更新的时候,传network,但是是添加network

(1)部分传参,报错

{
  "ServiceId": "aqp2b7cmrh5egjezenuf0vx6r",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    },
    {
      "Target": "my-net",
      "Aliases": null,
      "DriverOpts": null
    }
  ]
}

(2)全量传参,不报错

{
  "ServiceId": "bn0k9vxspi98m8qz9ceh14jc1",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Command": [],
  "ContainerEnv": [],
  "PortConfig": [
    {
      "Protocol": "tcp",
      "TargetPort": 80,
      "PublishedPort": 8082
    }
  ],
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    },
    {
      "Target": "my-net",
      "Aliases": null,
      "DriverOpts": null
    }
  ],
  ...省略
}

4. 更新的时候,传network,但是是移除一个network

(1)部分传参,报错

{
  "ServiceId": "5k0nt8l45nbycxpzb0o5gzy38",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ]
}

(2)全量传参,不报错

{
  "ServiceId": "21ixmxc0xvh4s0t2jr1ke1ofl",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Command": [],
  "ContainerEnv": [],
  "PortConfig": [
    {
      "Protocol": "tcp",
      "TargetPort": 80,
      "PublishedPort": 8082
    }
  ],
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ],
  ...省略
}

总结以上发现,只要是只传部分参数,就会报错,但我又不能每次更新都让调用接口的人把所有的参数传过来,怎么办呢?

猜你喜欢

转载自www.cnblogs.com/zhzhlong/p/12793028.html