我有以下 Dockerfile ,可为我的Go项目构建映像。
FROM golang:1.11.2-alpine3.8 as go-compile
RUN apk update && apk add git
RUN mkdir /app
COPY src/ /app
WORKDIR /app
RUN go get github.com/joho/godotenv
RUN go build -o main .
FROM alpine:latest
RUN mkdir /app
COPY --from=go-compile /app/main /app/main
CMD ["/app/main"]
该映像已构建,但我的“ .env”文件未包含在Docker映像中。
我尝试使用src
将{.1}文件夹中的“ .env”复制到图像中,但是Go代码仍然找不到/读取文件。
如何包含“ .env”文件,或者实际上包含任何其他非Go文件?
答案 0 :(得分:3)
您不能在go build
进程中包含非运行文件。 Go工具不支持将任意文件“嵌入”到最终可执行文件中。
您应该使用go build
来生成可执行文件,然后生成所有非可执行文件,例如模板,图像,配置文件需要对该可执行文件可用。那是;可执行文件需要知道非运行文件在运行go程序的主机的文件系统上的位置,然后根据需要打开并读取它们。因此,不必再将.env
嵌入main
中,而是将.env
与main
一起复制到您要运行main
的相同位置。
那么dockerfile的问题是目标主机仅从go-compile(COPY --from=go-compile /app/main /app/main
)复制了最终的可执行文件,而没有复制go-compile中存在的任何其他文件。图片,因此您的main
应用无法访问.env
,因为它们不在同一主机上。
@ mh-cbon在评论中指出,确实存在将非执行文件嵌入go二进制文件的第三方解决方案,其中一种是gobuffalo/packr
。
答案 1 :(得分:0)
您可以使用 docker compose 将 dotenv 文件或单个变量注入到您的服务中:
version: "3.9"
services:
backend:
...
environment:
- NODE_ENV=production
env_file:
- ./backend/.env