docker - 在 docker 2-stage build 中复制文件而不是同名目录

在以下 Dockerfile

WORKDIR /app
RUN go build -ldflags "-s -w" -a -installsuffix cgo -o tool-web ./tool-web

...

FROM scratch
COPY --from=build /app/tool-web /app/tool-web

结果是 COPY 指令复制了目录 tool-web 而不是二进制文件。

有没有办法指定要复制二进制文件的 COPY

回答1

根据 go 命令 https://pkg.go.dev/cmd/go

-o 标志强制构建将生成的可执行文件或对象写入指定的输出文件或目录,而不是最后两段中描述的默认行为。如果命名输出是现有目录或以斜杠或反斜杠结尾,则任何生成的可执行文件都将写入该目录。

因此,如果您使用 -o tool-web 并且 ./tool-web/ 是现有目录,则您的输出二进制文件将作为文件写入 tool-web 目录中。一个不错的猜测是您的二进制文件可能已安装为 ./tool-web/main

为了解决这个问题,两种简单的方法是:

  1. 找出二进制文件的安装路径,并调整 COPY 以使用该路径作为源
    • COPY --from=build /app/tool-web/main /app/tool-web
  2. 或者,更改 -o 以写入不同的文件名,然后调整 COPY 以使用该名称作为源
    • -o tool-web-binary
    • COPY --from=build /app/tool-web-binary /app/tool-web