dotenv 是否覆盖 docker compose 设置的环境变量?

Does dotenv override envvars set by docker compose?

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

.env.production

DO_NOT_SEND_EMAILS=false

docker-compose.ci.yml

services:
  my-app:
    environment:
      - DO_NOT_SEND_EMAILS=true

似乎 dotenv 不会覆盖在环境中定义的变量,by design:

By default, it won't overwrite existing environment variables as dotenv assumes the deployment environment has more knowledge about configuration than the application does. To overwrite existing environment variables you can use 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

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

中使用
    env_file:
      - '.env.production'

而不是:

    environment:
      - DO_NOT_SEND_EMAILS=true

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