在以下 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
。
为了解决这个问题,两种简单的方法是:
- 找出二进制文件的安装路径,并调整
COPY
以使用该路径作为源COPY --from=build /app/tool-web/main /app/tool-web
- 或者,更改
-o
以写入不同的文件名,然后调整COPY
以使用该名称作为源-o tool-web-binary
COPY --from=build /app/tool-web-binary /app/tool-web