根本原因是当前用户无权访问 /var/run/docker.sock,需将用户加入 docker 用户组并重启终端或系统;也可临时用 sudo docker 执行命令。

连接 Docker Daemon 时 permission denied 怎么办
根本原因不是代码写错,而是进程没权限访问 /var/run/docker.sock。SDK 不会自动读取 DOCKER_HOST,也不默认连 Unix socket,必须显式指定 host。
- Linux/macOS:用
unix:///var/run/docker.sock,运行 Go 程序的用户必须在docker用户组,否则报permission denied while trying to connect to the Docker daemon socket - macOS(Docker Desktop):实际路径是
unix:///Users/$USER/.docker/run/docker.sock,别硬写/var/run - WSL2:推荐开启 Docker Desktop 的 “WSL integration”,仍可用
unix:///var/run/docker.sock;若走 TCP,需设tcp://localhost:2375并在 Docker Desktop 中启用 “Expose daemon”(仅限开发)
初始化客户端示例:client.NewClientWithOpts(client.WithHost("unix:///var/run/docker.sock"), client.WithAPIVersionNegotiation())
ContainerCreate 报 invalid reference format 或 No command specified
这不是网络或权限问题,而是配置结构体字段不合法——SDK 不校验、不补全、不提示,出错就是 HTTP 400。
-
Config.Image必须带 tag,写"nginx"会失败,得写"nginx:alpine"或"nginx:1.25" -
Cmd和Entrypoint类型是[]string,传"sh -c 'echo hello'"这种字符串会静默失败,得拆成[]string{"sh", "-c", "echo hello"} -
HostConfig不能为nil,必须显式初始化:&container.HostConfig{AutoRemove: true},否则端口映射、挂载卷等全失效 - 端口映射要两步:先在
Config.ExposedPorts声明map[string]struct{}{"80/tcp": {}},再在HostConfig.PortBindings填map[string][]nat.PortBinding{"80/tcp": {{HostPort: "8080"}}}
ImagePull 后卡住、ContainerLogs 不返回、ContainerStart 报 configured for host network
这些看似独立的问题,本质都是流式接口未消费完或参数冲突导致的阻塞/校验失败。
-
client.ImagePull返回io.ReadCloser,必须消费全部流:io.Copy(io.Discard, resp)或逐行解码 JSON,否则后续调用(如ContainerCreate)会卡死 -
client.ContainerLogs默认Follow: true,不设Follow: false就会一直阻塞,直到容器退出;还要注意日志是带 ANSI 控制符的字节流,直接转string可能乱码 -
HostConfig.NetworkMode = "host"时,client.ContainerStart调用中不能传types.ContainerStartOptions{Platform: ""},Docker SDK 1.14+ 会校验并报错;真正需要平台时,应在ImagePull阶段用image.PullOptions{Platform: "linux/amd64"}
销毁容器时 panic: No such container
不是容器不存在,而是你用了截断的 ID 或误判了创建结果。
-
ContainerCreate返回的是container.ContainerCreateCreatedBody,里面只有ID字段;ID返回即表示已注册,可立刻ContainerStart,无需轮询 - 别取
CreatedBody.ID[:12]当 ID 用——daemon 返回的是完整 64 位 hash,截断后匹配不上,ContainerStop或ContainerRemove就会报No such container - 销毁前建议加一层防护:
client.ContainerInspect(ctx, id)检查是否存在;删除时用ContainerRemoveOptions{Force: true, RemoveVolumes: true}避免残留
最易被忽略的点:所有流式响应(ImagePull、ContainerLogs、Events)都必须显式关闭或消费完毕,否则连接池耗尽、goroutine 泄漏、后续请求全部 hang 住。这不是“可选优化”,是必须执行的操作。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











