gpt4 book ai didi

docker run -w 从 go 脚本运行时出现意外错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:33 25 4
gpt4 key购买 nike

我正在编写一个非常简单的脚本,它只是通过 docker 为 go 应用程序格式化构建命令。它格式化命令如下:

docker run --rm -v c:/Users/me/go/src/goapp:/go/src/goapp -w /go/src/goapp -e GOOS=os -e GOARCH=arch image go build -v -o outputname

运行它时,我得到以下信息:

docker: Error response from daemon: the working directory ' /go/src/goapp' is invalid, it needs to be an absolute path

我试过像这样重新格式化它:

docker run --rm -v="c:/Users/me/go/src/goapp:/go/src/goapp" -w="/go/src/goapp" -e="GOOS=os" -e"GOARCH=arch" image go build -v -o outputname

得到同样的错误,只有“无效”的工作目录是"/go/src/goapp"

这是我的代码:

package main

import (
"bytes"
"flag"
"fmt"
"os"
"os/exec"
"runtime"
"strings"
)

func constructCmd(volumeMap, workingDir, goos, goarch, output, image string) []string {
finalCmd := append([]string{"run", "--rm"},
fmt.Sprintf("-v='%s'", volumeMap),
fmt.Sprintf("-w='%s'", workingDir),
fmt.Sprintf("-e='%s'", goos),
fmt.Sprintf("-e='%s'", goarch),
)

finalCmd = append(finalCmd, image, "go build -v")

if output != "" {
finalCmd = append(finalCmd, fmt.Sprintf("-o %s", output))
}

return finalCmd
}

func main() {
// Parse flags
osPtr := flag.String("os", "windows", "Target distribution")
archPtr := flag.String("arch", "amd64", "Target distribution")
outputPtr := flag.String("out", "", "Output file name")
flag.Parse()

fmt.Printf("Building for %s/%s:\n", *osPtr, *archPtr)

goos := "GOOS=" + *osPtr
goarch := "GOARCH=" + *archPtr

pwd, _ := os.Getwd()
if runtime.GOOS == "windows" {
pwd = strings.Replace(pwd, "C", "c", 1)
pwd = strings.Replace(pwd, "\\", "/", -1)
}
workingDir := pwd[strings.Index(pwd, "/go"):]
volumeMap := fmt.Sprintf("%s:%s", pwd, workingDir)

var image string
if len(flag.Args()) == 0 {
image = "golang"
} else {
image = flag.Args()[0]
}

execCmd := constructCmd(volumeMap, workingDir, goos, goarch, *outputPtr, image)

cmd := exec.Command("docker", execCmd...)
cmdOutput := &bytes.Buffer{}
cmd.Stdout = cmdOutput
cmd.Stderr = cmdOutput
err := cmd.Run()
if err != nil {
os.Stderr.WriteString(err.Error())
}
fmt.Print(string(cmdOutput.Bytes()))
}

请注意,如果我直接运行此命令,则没有问题。没有错误。所以这不是 docker 问题,而是 go 问题。什么可能导致此错误?

最佳答案

删除引号。如 the exec package's documentation 中所述, Go 的标准 lib os/exec 包不会调用 shell 来执行 Cmd:

Unlike the "system" library call from C and other languages, the os/exec package intentionally does not invoke the system shell and does not expand any glob patterns or handle other expansions, pipelines, or redirections typically done by shells. The package behaves more like C's "exec" family of functions.

除非您在命令中调用 shell,否则不会调用 shell 来处理和删除这些引号。

例如,这个:

"-v='%s'"

应该是这样的:

"-v=%s"

评论更新:OP 还发现并修复了第二个问题:

"go build -v"

需要拆分成单独的参数:

"go", "build", "-v"

关于docker run -w 从 go 脚本运行时出现意外错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com