Включите файл .env в команду `go build` - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть следующий 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.

Я пытался скопировать ".env" из папки src в изображение, используя COPY src/.env /app/.env, но код Go по-прежнему не может найти / прочитать файл.

Как включить файл ".env" или фактически любой другой файл, кроме Go?

1 Ответ

0 голосов
/ 20 февраля 2019

Вы не можете включать не-go файлы в процесс go build.Инструмент Go не поддерживает «встраивание» произвольных файлов в конечный исполняемый файл.

Вы должны использовать go build, чтобы затем создать свой исполняемый файл, любые непроходные файлы, например шаблоны, изображения, файлы конфигурации, нужнобыть доступным для этого исполняемого файла.То есть;исполняемый файл должен знать, где находятся не-go файлы в файловой системе хоста, на котором запущена программа go, а затем открывать и читать их по мере необходимости.Так что забудьте о встраивании .env в main, вместо этого скопируйте .env вместе с main в то же место, из которого вы хотите запустить main.

Тогда проблема с вашим докер-файломтот факт, что целевой хост копирует только конечный исполняемый файл из go-compile (COPY --from=go-compile /app/main /app/main), он не копирует другие файлы, присутствующие в образе go-compile, и поэтому ваше приложение main не может получить доступ к .envпоскольку они не находятся на одном хосте.


Как указывалось в комментариях @ mh-cbon, существуют сторонние решения для встраивания не go-файлов в двоичный файл go, один изчто gobuffalo/packr.

...