golang 应用程序的多阶段 docker 构建找不到 .env 文件

问题描述

我正在尝试为一个让我发疯的 golang 应用程序调试多阶段 docker 构建。

docker文件如下

FROM golang:1.15-alpine as build

RUN apk add --no-cache git

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64


workdir /build

copY go.mod .
copY go.sum .
RUN go mod download

copY . .

RUN go build -o main .

workdir /dist

RUN cp /build/main .
RUN cp /build/.env .

workdir /dist/keys
RUN cp /build/keys/* .

FROM alpine as runtime

copY --from=build /dist/main /app/
copY --from=build /build/keys/* /app/keys/
copY --from=build /build/.env /app/

CMD [ "/app/main" ]

如果我构建它并使用 -it /bin/bash 运行它,我可以看到应用程序在正确的位置,.env 文件在那里,密钥也在那里。

事实上,我可以愉快地以交互方式运行 ./main 应用程序。

但是...当我尝试去做

 - docker run -it --rm --hostname dld --name dld dld                               15:57:42
2021/02/17 05:57:47 Error loading .env file

它显然找不到 .env 文件

我试图从头开始构建第二阶段,但我无法以交互方式进行任何操作,因此尽管我会尝试使用 alpine 进行调试。

为了得到我运行的 shell

docker run -it --rm --hostname dld --name dld dld /bin/sh

解决方法

好的,找到了一个有效的脚本。

FROM golang:1.15-alpine as build

RUN apk add --no-cache git

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64


WORKDIR /build

COPY go.mod go.sum ./
RUN go mod download

COPY . .

RUN go build -o main .

WORKDIR /dist

RUN cp /build/main .
RUN cp /build/.env .

WORKDIR /dist/keys/
RUN cp /build/keys/* .

FROM scratch as runtime

WORKDIR /app/keys/
COPY --from=build /build/keys/* ./

WORKDIR /app

COPY --from=build /dist/main .
COPY --from=build /build/.env .

CMD [ "./main" ]