在Docker中将secret env变量存储为单独的数据容器

在Docker中将secret env变量存储为单独的数据容器,docker,docker-compose,Docker,Docker Compose,我想在docker compose中使用来自主机操作系统的“secret”(密码等)环境变量 我认为使用数据容器可以实现这一点。但它不起作用-“没有文件存在”。请告知问题所在,以及这样做是否可行 docker-compose.yml version: '2' services: web: build: . command: bundle exec puma env_file: .env environment: - RACK_ENV=product

我想在docker compose中使用来自主机操作系统的“secret”(密码等)环境变量

我认为使用数据容器可以实现这一点。但它不起作用-“没有文件存在”。请告知问题所在,以及这样做是否可行

docker-compose.yml

version: '2'
services:
  web:
    build: .
    command: bundle exec puma
    env_file: .env
    environment:
      - RACK_ENV=production
      - RAILS_ENV=production
    volumes_from:
      - config
    ports:
      - "3000:3000"
    links:
      - db

  config:
    image: busybox
    volumes:
      - /myapp/config/.env:.env
我还尝试使用
/myapp/config:/config
作为卷,使用
/config/.env
作为env_文件,但结果相同

Dockerfile没有以任何方式提及或引用“config”或“.env”

感谢您的回复。

撰写环境文件
env_文件
由运行它的目录中的
docker compose
本地读取。然后在运行时将变量传递给容器(如
docker run-e

替代 还可以将Compose添加到配置中

如果在使用如下环境定义运行
docker compose
时在主机上设置了
SECRET\u HOST\u ENV\u变量

web:
  build: .
  command: bundle exec puma
  environment:
    - RACK_ENV=production
    - RAILS_ENV=production
    - SECRET_ENV_VARIABLE=${SECRET_HOST_ENV_VARIABLE}
  ports:
    - "3000:3000"
  links:
    - db

SECRET\u ENV\u变量
将在容器环境中可用

您能解释一下为什么要尝试执行主机映射文件->配置容器->web容器吗?为什么不只是映射文件->web容器?另外,如果容器进程只需要环境中可用的环境变量(与实际文件相反),您可以通过Compose YAML将主机环境变量映射到容器中(就像您映射了
-e
)。如果这是您真正想要的,我很乐意用一个例子来创建一个答案。如果您有一个env变量,它已经不是秘密了——在多个进程的内存中可能有多个副本。如果您担心对系统上的其他实体隐藏它,请使用具有高度受限访问权限的配置文件或专用工具。
web:
  build: .
  command: bundle exec puma
  environment:
    - RACK_ENV=production
    - RAILS_ENV=production
    - SECRET_ENV_VARIABLE=${SECRET_HOST_ENV_VARIABLE}
  ports:
    - "3000:3000"
  links:
    - db