使用golang exec执行docker命令失败

9

我正在使用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()
}

编辑:在收到评论后,我尝试执行命令“docker images”。如果我使用sudo以管理员身份运行可执行文件,则可以正常工作。因此,现在我在代码中使用以下行。

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

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


即使不使用sudo,运行docker images是否会产生预期的结果? - Thomasleveil
是的,docker images命令可以工作!(只有在我使用sudo运行生成的go可执行文件时才能工作,否则不行。)我在问题上面进行了编辑。 - Madhav Jha
我的意思是不使用你的go程序。例如:在控制台中输入“$ docker image”。它能够在没有sudo的情况下工作吗? - Thomasleveil
不,它在控制台中没有sudo是无法工作的。错误:2014/10/16 16:56:05获取http:///var/run/docker.sock/v1.14/images/json时出错:拨号unix /var/run/docker.sock:权限被拒绝。 - Madhav Jha
嗨,Thomas。我做到了,现在我不需要使用sudo了。但是我仍然无法从go程序的exec中执行以下docker命令:docker run -v ~/exp/a.out:/a.out ubuntu:14.04 /a.out -m 10m。(现在我可以在不使用sudo的情况下从go程序运行docker镜像。) - Madhav Jha
显示剩余2条评论
1个回答

25

多亏了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组中,对吧? - TFennis
快速测试解决方案的好例子。 - Altenrion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接