docker API接口service update錯誤記錄 error while removing network:…


一、問題 error while removing network:…

創建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
    }
  ],
  ...省略
}

總結以上發現,只要是只傳部分參數,就會報錯,但我又不能每次更新都讓調用接口的人把所有的參數傳過來,怎么辦呢?

 大量測試,從全量傳參一個一個減少參數,看看到底是哪個參數不傳造成的,經過測試發現必須要穿更新配置參數UpdateConfig,並且Parallelism參數(同時更新數)必須設置為1(個人猜測是docker service異步更新造成的?)

{
  "ServiceId": "ldpoqhv2yufff7i7ulqutii9c",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "Networks": [
    {
      "Target": "chow",
      "Aliases": null,
      "DriverOpts": null
    }
  ],
  "UpdateConfig": {
    "Parallelism": 1,
    "Delay": 10000000000,
    "FailureAction": "",
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": null
  }
}

既然找到原因了,那么設置成這個參數為非空必傳就行了,但是有個問題,每次都要取查詢上次的這個參數,比較麻煩,個人解決方案是再程序內部判斷接口是否傳這個參數

如果接口沒傳這個參數,內部邏輯代碼是主動去查,用查到的填充

如果接口傳了這個參數,內部邏輯代碼是主動去查,用查到的數據判斷有沒有network配置,如果有network配置,再去判斷傳的參數是否設置Parallelism為1,如果不是,提醒接口調用者

 

最后又做了不等service 的副本容器啟動起來,立即更新srvice,報錯

 

 

5. 創建的時候,不全兩傳參且不設置network,更新的時候,完全沒問題,即使更新的時候不穿UpdateConfig參數

service/create

[{
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 3
}]

service/update

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

6. 創建service的時候不全傳,但參設置network,不設置UpdateConfig

1. 更新的時候不傳network和UpdateConfig,報錯

創建參數:

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

更新參數:

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

2. 更新的時候不傳network,傳UpdateConfig,不報錯

創建參數:

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

更新參數:

{
  "ServiceId": "6vlve54skeq2odj5py4aign3f",
  "Image": "nginx",
  "ImageVersion": "1.17",
  "ServiceName": "test-chow",
  "Replicas": 2,
  "UpdateConfig": {
    "Parallelism": 1,
    "Delay": 10000000000,
    "FailureAction": "",
    "Monitor": null,
    "MaxFailureRatio": 0,
    "Order": null
  }
}

三、結論:

經過測試(沒有大量測試),目前發現的是

如果創建service的時候設置network,那么更新service的時候需要傳參UpdateConfig參數

如果創建service的時候不設置network,那么更新service的時候,可以不穿UpdateConfig參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM