Как передать переменную ENV для построения процесса в Docker - PullRequest
0 голосов
/ 01 марта 2020

При создании контейнера для моего Go приложения возникают проблемы с переменными среды.

На моем локальном компьютере я могу сделать следующее:

export GIN_MODE=release
go build -a

Это скомпилирует мое приложение в способ, при котором библиотека с именем GIN будет замечать env-переменную GIN_MODE и вести себя по-другому.

Когда я запускаю приложение, оно будет сообщать

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

, если эта ENV-переменная не была установите и он пропустит это предупреждение, если переменная GIN_MODE была установлена ​​правильно.

Однако в Docker это не будет работать таким образом.

В моем Dockerfile я написал эти speci c строк кода:

# Build the Go app
ENV GIN_MODE=release
RUN CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o main .

Я также пытался передать переменную непосредственно в операторе RUN:

RUN GIN_MODE=release CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o main .

Переменная никогда не будет видна оператору go-build .

Как мне этого добиться?

1 Ответ

3 голосов
/ 02 марта 2020

Переменные окружения не компилируются в двоичный файл go. Переменные среды - это свойства процесса, которые передаются их дочерним процессам.

Ваш Dockerfile правильно устанавливает переменную среды GIN_MODE. Но этот Dockerfile, кажется, используется для сборки двоичного файла go, но не для запуска / развертывания скомпилированного двоичного файла. Таким образом, вы должны убедиться, что вы также задали переменную среды GIN_MODE для контекста выполнения развернутого приложения, независимо от того, может ли это быть элемент Dockerfile или systemd или какой-либо другой способ развертывания.


Причина, по которой он "работал", когда вы вручную выполняли go build в своей оболочке, заключалась в том, что процесс оболочки переносил переменную окружения GIN_MODE, когда вы запускали export GIN_MODE=release, а вы Для последующего запуска приложения использовалась та же оболочка, переменная окружения GIN_MODE была доступна вашему приложению в качестве дочернего процесса из вашей оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...