dotenv 是否会覆盖 docker compose 设置的 envvars?

Mir*_*318 4 ruby-on-rails docker ruby-dotenv

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

.env.生产

DO_NOT_SEND_EMAILS=false
Run Code Online (Sandbox Code Playgroud)

docker-compose.ci.yml

services:
  my-app:
    environment:
      - DO_NOT_SEND_EMAILS=true
Run Code Online (Sandbox Code Playgroud)
  • 这两个文件都包含更多内容,但这些是相关的行。
  • envvar最终会设置成什么?

Dan*_*nyB 11

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

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

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

这是一个最小的测试:

.env

SOMEVAR=from .env file
ANOTHERVAR=also from .env file
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3'

services:
  test:
    build: .
    command: ruby test.rb
    volumes:
    - .:/app
    environment:
      SOMEVAR: from docker compose
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM dannyben/alpine-ruby
WORKDIR /app
RUN gem install dotenv
COPY . .
Run Code Online (Sandbox Code Playgroud)

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']
Run Code Online (Sandbox Code Playgroud)

跑步:

$ docker-compose build
$ docker-compose run test
Run Code Online (Sandbox Code Playgroud)