Dockerfile中Protobuf的Go Get出错

Dockerfile中Protobuf的Go Get出错,go,docker,Go,Docker,这是我的Dockerfile: FROM golang RUN apt-get update RUN go get -u github.com/golang/protobuf/{proto,protoc-gen-go} 这将生成以下错误: package github.com/golang/protobuf/{proto,protoc-gen-go}: invalid github.com/ import path "github.com/golang/protobuf/{proto,prot

这是我的Dockerfile:

FROM golang
RUN apt-get update
RUN go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
这将生成以下错误:

package github.com/golang/protobuf/{proto,protoc-gen-go}: invalid github.com/ import path "github.com/golang/protobuf/{proto,protoc-gen-go}"
但是,如果我取出
RUN
指令,并将
/bin/bash
加载到docker容器中,我就可以很好地运行
goget
命令


发生了什么事?

之所以发生,是因为默认shell不是
/bin/bash
,而是
sh
。您有两种可能的解决方案,可以在RUN命令中显式定义shell,如下所示:

RUN ["/bin/bash", "-c", "go get -u github.com/golang/protobuf/{proto,protoc-gen-go}"]
或者您可以更改默认情况下运行的shell,如下所示:

SHELL ["/bin/bash", "-c"]
RUN go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

来源:

之所以发生这种情况,是因为默认shell不是
/bin/bash
,而是
sh
。您有两种可能的解决方案,可以在RUN命令中显式定义shell,如下所示:

RUN ["/bin/bash", "-c", "go get -u github.com/golang/protobuf/{proto,protoc-gen-go}"]
或者您可以更改默认情况下运行的shell,如下所示:

SHELL ["/bin/bash", "-c"]
RUN go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

来源:

如果我使用另一个shell,比如bash,并在
go
命令中加上双引号,它就会起作用

运行bash-c“gogetgithub.com/golang/protobuf/{proto,protocgengo}”

顺便说一下,您可以在一次运行中完成所有操作,请参阅Dockerfiles最佳实践


如果我使用另一个shell,比如bash,并在
go
命令中加上双引号,它就会起作用

运行bash-c“gogetgithub.com/golang/protobuf/{proto,protocgengo}”

顺便说一下,您可以在一次运行中完成所有操作,请参阅Dockerfiles最佳实践


您是否尝试在命令周围加引号?不确定这里到底发生了什么,但我怀疑一些shell字符串引用/扩展的奇怪之处。默认情况下,
RUN
使用
/bin/sh-c
;我认为引用参数是明智之举,但可能不是。执行运行行的shell是基本的
/bin/sh
,不进行大括号扩展。您是否尝试在命令周围加引号?不确定这里到底发生了什么,但我怀疑一些shell字符串引用/扩展的奇怪之处。默认情况下,
RUN
使用
/bin/sh-c
;我认为引用这个参数是明智的,但可能不是。执行运行行的shell是一个基本的
/bin/sh
,并且不进行大括号扩展。谢谢你提供的信息,但是这个答案对我不起作用-我得到了这个错误:
/bin/bash:go get-u github.com/golang/protobuf/{proto,protoc gen go}:没有这样的文件或目录
Ye,我没有时间测试它,所以这是一个近似值:p将在今天测试并修复确切的命令。OK tested。第一种方法运行良好,第二种方法现在已编辑,只需要将“-c”添加到SHELL指令中。感谢您提供的信息,但这个答案对我不起作用-我遇到了以下错误:
/bin/bash:go get-u github.com/golang/protobuf/{proto,protoc gen go}:没有这样的文件或目录
Ye,我没有时间测试它,所以这是一个近似值:p将在今天测试并修复确切的命令。OK tested。第一种方法运行良好,第二种方法现在已编辑,只需要在SHELL指令中添加“-c”。这个答案有效!尽管另一个解释了发生了什么:p这个答案有效!尽管另一个解释了发生了什么:P