cannot open file using dockerfile golang

fba*_*ril 0 go docker dockerfile

我在项目的根目录上有一个文件,我打开它是这样的:

    file, err := os.Open("file.csv")
Run Code Online (Sandbox Code Playgroud)

当我go run main.go让它工作时。当我使用 dockerfile 运行应用程序时,它不起作用:

打开 file.csv:没有这样的文件或目录

我的 dockerfile 是这样的:

FROM golang:alpine as builder
RUN mkdir /build 
ADD . /build/
WORKDIR /build 
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main .
FROM scratch
COPY --from=builder /build/main /app/
WORKDIR /app
CMD ["./main"]
Run Code Online (Sandbox Code Playgroud)

我不习惯 dockerfiles,所以也欢迎任何即兴表演!

Jak*_*kub 6

在该行中,COPY --from=builder /build/main /app/您只复制可执行文件。您不复制应用程序目录。将该行替换为COPY --from=builder /build /app/

下面我包含了一个如何编写这个 Dockerfile 的例子。以下是一些关键的变化。

  • WORKDIRCOPY指令之前定义,这样您就不必两次写入目录名称。这很有用,因为如果您想更改应用程序目录,您只需更改一次(这意味着出现错误的可能性较小)。
  • 使用COPY代替ADD。所述Dockerfile参考表明COPY是优选的。
  • RUN mkdir /build在使用WORKDIR或之前不必使用COPY。如果目录不存在,最后两条指令将创建该目录。
FROM golang:alpine as builder
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main .
FROM scratch
WORKDIR /app
COPY --from=builder /build .
CMD ["./main"]
Run Code Online (Sandbox Code Playgroud)