如何将 .env 文件传递​​到 Go 项目中的 docker 镜像?

Ami*_*Pal 0 environment-variables go docker kubernetes dockerfile

我的 Go 项目层次结构是这样的:

在此输入图像描述

主要功能:

func main() {
    path, _ := os.Getwd()
    err := godotenv.Load(filepath.Join(path, ".env"))
    if err != nil {
        log.Fatal("Error loading .env file")
    }
    server.Init()
}
Run Code Online (Sandbox Code Playgroud)

这是我的docker文件内容:

FROM golang:alpine AS build-env
LABEL MAINTAINER "Amit Pal <amit.pal@fynchmobility.com>"
ENV GOPATH /go
WORKDIR /go/src
COPY . /go/src/gothamcity
RUN cd /go/src/gothamcity && go build .

FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk*
WORKDIR /app
COPY --from=build-env /go/src/gothamcity/gothamcity /app

EXPOSE 8080

ENTRYPOINT [ "./gothamcity" ]
Run Code Online (Sandbox Code Playgroud)

我运行以下命令来构建并运行 docker 映像:

docker build -t gcr.io/${PROJECT_ID}/gothamcity:v1.0 .
docker run -ti gcr.io/miles-ee458/gothamcity:v1.0   
Run Code Online (Sandbox Code Playgroud)

我收到错误:

2021/01/28 14:34:46 Error loading .env file

我在这里做错了什么?如何将 .env 文件传递​​给 docker 映像并执行它?

另外,不是COPY . /go/src/gothamcity将整个项目复制到docker镜像中吗?

Vas*_*pov 10

COPY . /go/src/gothamcity仅复制 .env 来构建容器。您必须将其显式复制到主容器,如下所示:

FROM golang:alpine AS build-env
LABEL MAINTAINER "Amit Pal <amit.pal@fynchmobility.com>"
ENV GOPATH /go
WORKDIR /go/src
COPY . /go/src/gothamcity
RUN cd /go/src/gothamcity && go build .

FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk*
WORKDIR /app
COPY --from=build-env /go/src/gothamcity/gothamcity /app
COPY .env /app

EXPOSE 8080

ENTRYPOINT [ "./gothamcity" ]
Run Code Online (Sandbox Code Playgroud)

原因是当你说“FROM alpine”时,它就变成了一个全新的空白容器。这就是多阶段构建的工作方式。

  • 因为它只复制应用程序二进制文件 (3认同)