如何使用Axios调用Docker Daemon API获取容器列表?
解决Axios调用Docker Unix Socket API失败的问题
看起来你在尝试用Axios调用Docker的Unix Socket API时碰了壁,而原生http模块却能正常工作——这主要是因为Axios对Unix Socket的配置逻辑和原生http不同,再加上你代码里的一些多余引号拖了后腿。让我一步步帮你搞定:
先修正代码里的通用错误
不管是原生http还是Axios的代码,你都给字符串加了多余的嵌套双引号(比如socketPath: "\"/var/run/docker.sock\""),这其实是错误写法,正确的字符串应该直接写"/var/run/docker.sock",不需要额外转义引号。原生http模块可能侥幸能运行,但Axios对配置更严格,这会直接导致请求失败。
正确的Axios调用方式
方式一:通过httpAgent配置Unix Socket
Axios需要把socketPath配置在httpAgent实例里,而不是直接放在顶级配置项中。你需要引入Node.js的http模块创建Agent:
const axios = require('axios'); const http = require('http'); async function getDockerContainers() { try { const agent = new http.Agent({ socketPath: '/var/run/docker.sock' }); const axiosResult = await axios({ url: '/containers/json', method: 'GET', httpAgent: agent }); console.log(axiosResult.data); return axiosResult.data; } catch (error) { console.error('请求失败:', error.message); throw error; } } getDockerContainers();
方式二:使用Unix Socket URL格式
如果你想用URL的方式调用,需要遵循http://unix:/path/to/socket:/api/endpoint的格式(注意socket路径和API路径之间的冒号):
const axios = require('axios'); async function getDockerContainers() { try { const axiosResult = await axios.get('http://unix:/var/run/docker.sock:/containers/json'); console.log(axiosResult.data); return axiosResult.data; } catch (error) { console.error('请求失败:', error.message); throw error; } } getDockerContainers();
额外注意事项
- 确保你的容器已经正确挂载了
/var/run/docker.sock:/var/run/docker.sock卷,否则即使代码正确也无法访问Docker API。 - 如果Docker API需要指定版本号(比如v1.30),可以把API路径改成
/v1.30/containers/json,对应到两种方式里就是修改url参数或者URL路径。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

