我正试图在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
命令。
为什么会发生这种情况?
每个RUN命令都会启动一个具有干净环境和新默认工作目录的新shell。特别地,RUN cd ...
作为一个孤立的步骤没有任何作用。
如果您确实需要更改Dockerfile中的目录,请将这两个步骤合并为一个步骤,或者使用WORKDIR
指令使更改更具全局性。
在Go存储库的特定情况下,由于有一个标准的目录布局,至少是非常受欢迎的,我会使用它运行:
FROM golang
WORKDIR /go/src/github.com/me/myprogram
COPY . ./
RUN go install .
CMD ["/go/bin/myprogram"]
(一般来说,Go处理相关文件的整个目录或"包",而不一定是单个.go
文件。(