我不熟悉 Docker 或 devops,但我有这些文件:
.env.production
DO_NOT_SEND_EMAILS=false
码头工人-compose.ci.yml
services:
my-app:
environment:
- DO_NOT_SEND_EMAILS=true
- 这两个文件都包含更多内容,但这些是相关行。
- 最后将envvar设置为什么?
我不熟悉 Docker 或 devops,但我有这些文件:
.env.production
DO_NOT_SEND_EMAILS=false
码头工人-compose.ci.yml
services:
my-app:
environment:
- DO_NOT_SEND_EMAILS=true
如果它们是在环境中定义的,似乎 dotenv 不会覆盖变量,按设计:
默认情况下,它不会覆盖现有的环境变量,因为 dotenv 假设部署环境比应用程序更了解配置。要覆盖现有的环境变量,您可以使用 Dotenv.overload。
所以答案可能取决于您如何使用 dotenv -Dotenv.load
或Dotenv.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
文件...