jjzjj

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

coder 2024-07-05 原文

我正在编写一个非常简单的脚本,它只是通过 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/

有关docker run -w 从 go 脚本运行时出现意外错误的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  5. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  10. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

随机推荐