在Dockerfile中获取Protobuf的错误

这是我的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指令,并且在docker容器中加载/bin/bash ,我可以运行go get命令就好了。

这是怎么回事?

它工作,如果我使用另一个壳,如bash,并把双引号为go命令

RUN bash -c "go get github.com/golang/protobuf/{proto,protoc-gen-go}"

顺便说一下,你可以只用一个RUN来完成所有工作,参见Dockerfiles的最佳实践

https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

这是因为默认的shell 不是 /bin/bash ,而是sh 。 你有两种可能的解决scheme,你可以在你的RUN命令中明确地定义一个shell,像这样:

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

或者,您可以更改RUN默认使用的shell程序,如下所示:

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

来源: https : //docs.docker.com/engine/reference/builder/#/shell