3

我不熟悉 Docker 或 devops,但我有这些文件:

.env.production

DO_NOT_SEND_EMAILS=false

码头工人-compose.ci.yml

services:
  my-app:
    environment:
      - DO_NOT_SEND_EMAILS=true
  • 这两个文件都包含更多内容,但这些是相关行。
  • 最后将envvar设置为什么?
4

2 回答 2

4

如果它们是在环境中定义的,似乎 dotenv 不会覆盖变量,按设计

默认情况下,它不会覆盖现有的环境变量,因为 dotenv 假设部署环境比应用程序更了解配置。要覆盖现有的环境变量,您可以使用 Dotenv.overload。

所以答案可能取决于您如何使用 dotenv -Dotenv.loadDotenv.overload.

这是一个最小的测试:

.env

SOMEVAR=from .env file
ANOTHERVAR=also from .env file

docker-compose.yml

version: '3'

services:
  test:
    build: .
    command: ruby test.rb
    volumes:
    - .:/app
    environment:
      SOMEVAR: from docker compose

Dockerfile

FROM dannyben/alpine-ruby
WORKDIR /app
RUN gem install dotenv
COPY . .

test.rb

require 'dotenv'

# values in .env will override
# Dotenv.overload

# values in .env will be used only if not already set in the environment
Dotenv.load

p ENV['SOMEVAR']
p ENV['ANOTHERVAR']

跑步:

$ docker-compose build
$ docker-compose run test
于 2019-08-05T15:37:47.487 回答
1

据我所知,它不应该被覆盖。我个人在 docker env 中使用。

    env_file:
      - '.env.production'

代替:

    environment:
      - DO_NOT_SEND_EMAILS=true

在这种情况下总是会依赖.env.prod文件...

于 2019-08-05T15:55:08.450 回答