2 回答

TA貢獻1866條經驗 獲得超5個贊
首先,您使用的是多階段 Docker 構建,它非常適合僅將編譯的二進制文件復制到最終映像。但是,在 Dockerfile 中,您將復制整個構建目錄 - 二進制文件以及所有源代碼。server
其次,您的主要問題是當圖像作為容器運行時,默認工作目錄是 - 因此服務器中的任何路徑都找不到中的html文件。//bin/public
如果你需要調試一個 docker 鏡像 - 特別是如果它是一個基于 linux 發行版(如 alpine)的鏡像 - 只需:
docker run -it myimage /bin/sh
無論如何,對您的docker的2個簡單修復:
FROM golang:1.15.2-alpine3.12 AS builder
WORKDIR /app
COPY . .
WORKDIR /app/site
RUN CGO_ENABLED=0 GOOS=linux go build -o server
FROM alpine:3.12
COPY --from=builder /app/site/server /bin
COPY --from=builder /app/site/public /public
ENTRYPOINT [ "/bin/server" ]

TA貢獻2016條經驗 獲得超9個贊
在Go 1.16中,您可以將這些文件編譯成二進制文件本身。因此,您需要升級主機系統上的 Go 工具鏈,以及 Dockerfile 中構建階段的行。Go 1.16 添加了嵌入包和一個新指令來支持這一點。FROM//go:embed
首先,您需要告訴編譯器嵌入模板文件,構建一個文件系統對象:
import "embed"
// templateFiles contains the raw text of the template files.
//go:embed public/views/*.html
var templateFiles embed.FS
然后,當你去使用它時,Go 1.16還會添加一個相應的(“html/template”)。解析FS函數:
renderer := &TemplateRenderer{
templates: template.Must(template.ParseFS(templateFiles)),
}
現在所有文件都嵌入在二進制文件本身中,您不應該收到“找不到文件”類型錯誤。您可以考慮僅將已編譯的二進制文件復制到最終映像中,而不將任何其他內容復制到最終映像中。
# Upgrade to Go 1.16
FROM golang:1.16-alpine3.12 AS builder
# Unchanged from original
WORKDIR /app
COPY . .
WORKDIR /app/site
RUN CGO_ENABLED=0 GOOS=linux go build -o server
FROM alpine:3.12
# Only copy the compiled binary and not the source tree
COPY --from=builder /app/site/server /bin
# Generally prefer CMD to ENTRYPOINT
CMD [ "server" ]
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報