使用 Docker 将环境变量传递给 Spring Boot 应用程序不起作用

Posted

技术标签:

【中文标题】使用 Docker 将环境变量传递给 Spring Boot 应用程序不起作用【英文标题】:Passing Environment Variables With Docker to Spring Boot Application Not Working 【发布时间】:2018-10-06 16:23:50 【问题描述】:

我正在尝试将环境变量传递给 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 成功传递环境变量?

【问题讨论】:

【参考方案1】:

docker run 确实提到了

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

如果操作员命名环境变量但未指定值,则命名变量的当前值会传播到容器的环境中:

但例子是:

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

所以请检查您的引号和参数顺序(正如BMitch 所观察到的那样,任何参数完成之后图像名称将作为CMD 传递给您的图像入口点命令,这不是您的想要):

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

【讨论】:

谢谢!是的,这是一个订单。【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于使用 Docker 将环境变量传递给 Spring Boot 应用程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法将环境变量传递给 docker

我需要通过 gitlab-ci 中的 ssh 将 env 变量传递给 docker

将环境变量传递给 Docker 时,Flyway 迁移失败

如何将 Github Secret 作为环境变量传递给 Docker?

将所有主机环境变量传递给 docker 容器的最简单方法

如何将环境变量从 docker-compose 传递给项目?