我正在编写一个非常简单的脚本,它只是通过 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/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行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
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
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/