使用golang exec执行docker命令失败

时间:2014-10-16 18:40:14

标签: go exec docker

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

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

1 个答案:

答案 0 :(得分:10)

感谢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