某天使用python重启docker容器时,出现了一个令人费解的BUG,我的代码为
1 def restart_docker(container_name): 2 # 连接到docker守护进程 3 client = docker.from_env() 4 try: 5 # 获取容器对象 6 container = client.containers.get(container_name) 7 print("正在重启docker...") 8 # 重启容器 9 container.restart() 10 # 等待一段时间让容器重启 11 container.reload() 12 # 此容器8秒没挂就不会挂了,重启大概需要2-3秒,休眠10秒再访问状态,差不多了 13 time.sleep(10) 14 if container.status == "running": 15 print("重启docker成功!") 16 return True 17 else: 18 print("重启docker失败!") 19 return False 20 except: 21 print("重启docker出现错误!")
乍一看没啥问题,并且我在Windows和Linux测试服务器上反复测试了N多遍,在执行这个方法时并没有出现什么问题,当我第一次用于实战时,就出现了让我费解的问题
1 Traceback (most recent call last): 2 File "", line 1, in 3 File "/usr/lib/python3.10/site-packages/docker/client.py", line 81, in from_env 4 **kwargs_from_env(**kwargs)) 5 File "/usr/lib/python3.10/site-packages/docker/client.py", line 38, in init 6 self.api = APIClient(*args, **kwargs) 7 File "/usr/lib/python3.10/site-packages/docker/api/client.py", line 110, in init 8 config_dict=self._general_configs 9 TypeError: load_config() got an unexpected keyword argument 'config_dict'
我的第一反应就是,我的包可能出现了不兼容的问题,于是我检查了测试环境的python版本和docker版本,python为3.10.12,docker为6.1.3。
我再查看了出现异常的环境,然并卵,并没有什么不一样,完全一样的系统和环境,怎么会出现问题?百思不得其解,然后我在Github上找到了这篇
https://github.com/docker/docker-py/issues/1916
给出的解决方案两种,一种是删除python,重新安装,但是生产环境,我不能删除python,所以只能从跳过这个方案
第二种解决方法是降级docker版本为2.7,我尝试直接安装最新版的,为docker7.0.0,不行,然后当我将docker降级到2.7的时候,执行代码成功!
但是为了保险,测试完了,我还是将docker换回了6.1.3,并改了一下代码
1 import time 2 3 import subprocess 4 import docker 5 6 7 def restart_docker(container_name): 8 try: 9 # 连接到docker守护进程 10 client = docker.from_env() 11 # 获取容器对象 12 container = client.containers.get(container_name) 13 print("正在重启docker...") 14 # 重启容器 15 container.restart() 16 # 等待一段时间让容器重启 17 container.reload() 18 # 此容器8秒没挂就不会挂了,重启大概需要2-3秒,休眠10秒再访问状态,差不多了 19 time.sleep(10) 20 if container.status == "running": 21 print("重启docker成功!") 22 return True 23 else: 24 print("重启docker失败!") 25 return False 26 except: 27 try: 28 print("重启docker出现错误!进行手动重启!") 29 subprocess.call(["docker", "restart", container_name], timeout=10) 30 print("已手动重启!请检查docker状态!") 31 except: 32 print("手动重启失败!")
简单粗暴,先用着,目前我还在找原因,所以你们可以自己选择符合实际的解决方案