【问题标题】:Include .env file in `go build` command在 `go build` 命令中包含 .env 文件
【发布时间】:2019-07-13 23:59:09
【问题描述】:

我有以下 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 镜像中。

我尝试使用COPY src/.env /app/.env 将src 文件夹中的“.env”复制到图像中,但Go 代码仍然无法找到/读取该文件。

如何包含“.env”文件,或者实际上是任何其他非 Go 文件?

【问题讨论】:

    标签: docker go dockerfile


    【解决方案1】:

    您可以使用 docker compose 将 dotenv 文件或单个变量注入您的服务:

    version: "3.9"
    services:
      backend:
        ...
        environment:
          - NODE_ENV=production
        env_file:
          - ./backend/.env
    

    【讨论】:

      【解决方案2】:

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

      您应该使用go build 来构建您的可执行文件,任何非执行文件,例如模板、图像、配置文件需要对该可执行文件可用。那是;可执行文件需要知道非 go 文件在运行 go 程序的主机的文件系统上的位置,然后根据需要打开并读取它们。所以忘记将.env 嵌入到main 中,而是将.env 与main 一起复制到您要运行main 的同一位置。

      那么你的 dockerfile 的问题是目标主机只从 go-compile (COPY --from=go-compile /app/main /app/main) 复制最终的可执行文件,它不会复制 go-compile 映像中存在的任何其他文件和因此您的main 应用程序无法访问.env,因为它们不在同一主机上。


      正如@mh-cbon 在 cmets 中指出的那样,确实存在将非 go 文件嵌入 go 二进制文件的 3rd-party 解决方案,其中之一是 gobuffalo/packr。

      【讨论】:

      • 我认为应该说存在将文件嵌入到go bin的解决方案,例如参见github.com/gobuffalo/packr
      • 另外,在没有WORKDIR的情况下,最后的Dockerfile阶段会跑出容器的根目录;如果程序正在寻找$PWD/.env 或$HOME/.env,则值得检查它们是否对齐。
      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 2018-04-27
      • 2022-01-21
      • 2017-02-10
      • 2018-07-27
      • 2022-10-15
      • 2016-10-10
      • 2017-04-23
      相关资源
      最近更新 更多