我正在尝试在dockerfile中运行go build hello.go
,
FROM golang
COPY hello.go /go/src/hello.go
RUN cd src/
RUN go build hello.go
RUN ./hello
一切顺利,直到执行go build
命令,然后出现以下错误消息:
stat hello.go: no such file or directory
The command '/bin/sh -c go build hello.go' returned a non-zero code: 1
但是,如果我在dockerfile上注释了最后两个命令并运行创建的映像,则可以毫无问题地运行go build
命令。
为什么会这样?
答案 0 :(得分:3)
每个RUN命令都会使用干净的环境和新的默认工作目录启动一个新的Shell。尤其是,RUN cd ...
作为隔离的步骤什么也没做。
如果确实需要更改Dockerfile中的目录,则可以将两个步骤组合为一个步骤,也可以使用WORKDIR
指令来更全局地进行更改。
在Go存储库的特定情况下,由于至少强烈建议使用standard directory layout,因此我会使用它:
FROM golang
WORKDIR /go/src/github.com/me/myprogram
COPY . ./
RUN go install .
CMD ["/go/bin/myprogram"]
(通常,Go处理相关文件的整个目录或“包”,而不必处理单个.go
文件。)