如何将环境变量传递给docker-compose的应用程序

时间:2019-01-25 06:43:09

标签: docker docker-compose environment-variables

我想传递docker-compose up启动的应用程序可以读取的环境变量。

在不同的配置设置下使用docker-compose up的正确方法是什么?

我不想使用.envenvironment:配置,因为环境变量经常更改,并且将令牌保存在文件中是不安全的。

docker-compose run -e确实可以工作,但会丢失很多。 它不映射docker-compose.yml服务中定义的端口。 此外,docker-compose.yml中定义了多种服务,我不想仅仅因为depends_on不起作用而使用docker-compose up

假设我在docker-compose.yml中定义服务

    service-a:
        build:
          context: .
          dockerfile: DockerfileA
        command: node serviceA.js

在我的serviceA.js中,我仅使用环境变量:

console.log("This is ", process.env.KEY, "running in service A");

当我运行docker-compose run -e KEY=DockerComposeRun service-a时 我确实获得了serviceA.js读取的环境变量KEY

This is  DockerComposeRun running in service A

但是我只能运行一项服务。


我本可以在environment:中使用docker-compose.yml

environment:
  - KEY=DockerComposeUp

但是在我的用例中,每个docker compose都会具有不同的环境变量值,这意味着我每次执行docker-compose时都需要编辑文件。

此外,不仅单个服务将使用相同的环境变量,.env甚至做得更好,但这不是所希望的。


似乎没有一种方法可以对docker-compose up执行相同操作 我已经尝试过KEY=DockerComposeUp docker-compose up, 但是我得到的是undefined

导出对我也不起作用,似乎它们全部是为docker-compose.yml使用环境变量而不是为容器中的应用程序

2 个答案:

答案 0 :(得分:3)

您可以使用以下环境:

import spock.lang.Specification

class MyServiceTest extends Specification {
    def "Welcome"() {
        setup: "create mock object"
        def myService = Spy(MyService)

        when: "invoke welcomeMessage"
        def actual = myService.welcome("any")

        then:
        actual == "any"
    }
}

请参考:https://docs.docker.com/compose/environment-variables/

答案 1 :(得分:2)

要安全地将敏感配置数据传递到您的容器,可以使用Docker secrets。通过Secrets传递的所有内容均已加密。

您可以使用以下命令创建和管理机密:

docker secret create
docker secret inspect
docker secret ls
docker secret rm

并在您的docker-compose文件中使用它们,或者引用现有秘密(外部)或使用文件:

secrets:
  my_first_secret:
    file: ./secret_data
  my_second_secret:
    external: true