使用 golang exec 执行 docker 命令失败

Posted

技术标签:

【中文标题】使用 golang exec 执行 docker 命令失败【英文标题】:Executing docker command using golang exec fails 【发布时间】:2014-12-12 05:52:17 【问题描述】:

我正在使用 cmd.go(见下文)执行 docker 命令,但它失败了。我执行以下步骤并得到以下错误。

go build
sudo ./cmd

输出:

docker run -v ~/exp/a.out:/a.out ubuntu:14.04 /a.out -m 10m
2014/10/16 14:32:12 exit status 1

另一方面直接运行

sudo docker run -v ~/exp/a.out:/a.out ubuntu:14.04 /a.out -m 10m

导致 a.out 的正确输出。

Hello World

这是 cmd.go 的代码。我怎样才能让它工作?谢谢!

package main

import (
        "fmt"
        "log"
        "os/exec"
        "strings"
)

func ExampleCmd_Output() 
        //out, err := exec.Command("date", "--version").Output()   // This works
        //out, err := exec.Command("docker", "--version").Output() // This works
        //out, err := exec.Command(cmd, "images").Output() // Even docker images command works!

        cmd := "docker"
        cmdArgs := []string"run", "-v", "~/exp/a.out:/a.out", "ubuntu:14.04", "/a.out", "-m", "10m"
        fmt.Println(cmd + " " + strings.Join(cmdArgs, " "))
        out, err := exec.Command(cmd, cmdArgs...).Output()
        if err != nil 
                log.Fatal(err)
        
        fmt.Printf("%s", out)


func main() 
        ExampleCmd_Output()

out, err := exec.Command(cmd, "images").Output()

在执行 go build 并运行“sudo ./cmd”之后,我得到了 docker images 命令的输出。但是,没有 sudo,我仍然会得到退出状态 1。但是使用上面的 docker run 命令,即使使用 sudo,我也没有得到输出。

【问题讨论】:

docker images
是的,docker images 命令有效! (它仅在我使用 sudo 运行生成的 go 可执行文件时才有效,否则无效。)我在上面的问题中进行了编辑。
$ docker image
不,如果没有控制台中的 sudo,它将无法工作。错误:2014/10/16 16:56:05 获取 http:///var/run/docker.sock/v1.14/ images/json: 拨打 unix /var/run/docker.sock: 权限被拒绝
docker
【参考方案1】:

感谢Os Exec Sudo Command in Go,我现在可以做我想做的事了。

func main() 
  cmdStr := "sudo docker run -v ~/exp/a.out:/a.out ubuntu:14.04 /a.out -m 10m"
  out, _ := exec.Command("/bin/sh", "-c", cmdStr).Output()  
  fmt.Printf("%s", out)

输出:

Hello World

【讨论】:

我认为更好的解决方案可能是将运行命令的用户添加到docker组对吗? 快速测试解决方案的好例子

以上是关于使用 golang exec 执行 docker 命令失败的主要内容,如果未能解决你的问题,请参考以下文章