使用Docker传递环境变量使Spring引导应用程序无法正常工作

时间:2018-04-26 04:48:51

标签: docker spring-boot

我正在尝试将环境变量传递给Spring Boot应用程序,但它似乎没有起作用。

Docker运行命令:

docker run my-image -e TEST_VAR='testing'

Spring Boot main():

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(MyApplication.class, args);

        //Read environmental variables:
        Map<String, String> env = System.getenv();
        System.out.println("TEST_VAR: "+env.get("TEST_VAR"));


    }
}

输出:

TEST_VAR: null

如何使用Docker成功传递环境变量?

2 个答案:

答案 0 :(得分:2)

docker run确实提到了

  

此外,操作员可以使用一个或多个-e标志设置容器中的任何环境变量,甚至覆盖上面提到的那些,或者已经由开发人员用Dockerfile ENV定义。

     

如果操作员在未指定值的情况下命名环境变量,则命名变量的当前值将传播到容器的环境中:

但是例子是:

docker run -e "deep=purple" -e today --rm alpine env

请检查您的引号和参数顺序(如BMitch所示),之后所有参数将图像名称作为CMD传递给您的图像ENTRYPOINT命令,不是你想要的):

docker run -e "TEST_VAR=testing" my-image 

答案 1 :(得分:1)

选项顺序在docker命令行中很重要。在run命令之前可以传递标记,可以传递给run命令的标志,以及作为命令运行传递给图像的args。在您的示例中:

docker run my-image -e TEST_VAR='testing'

-e TEST_VAR='testing'作为要运行的容器(或入口点的参数)的CMD的新值传递。

通过重新排序命令,您将告诉run根据需要将环境变量传递给容器:

docker run -e TEST_VAR='testing' my-image