在`go build`命令中包含.env文件

时间:2019-02-20 10:19:32

标签: docker go dockerfile

我有以下 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文件?

2 个答案:

答案 0 :(得分:3)

您不能在go build进程中包含非运行文件。 Go工具不支持将任意文件“嵌入”到最终可执行文件中。

您应该使用go build来生成可执行文件,然后生成所有非可执行文件,例如模板,图像,配置文件需要对该可执行文件可用。那是;可执行文件需要知道非运行文件在运行go程序的主机的文件系统上的位置,然后根据需要打开并读取它们。因此,不必再将.env嵌入main中,而是将.envmain一起复制到您要运行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