Spring从Docker添加环境变量

时间:2019-12-11 08:12:18

标签: spring docker

我是Spring和Docker的新手。

我使用Gitlab提供的默认模板创建了一个项目。 它带有预定义的Dockerfile,我想在其上添加一些额外的环境变量以在我的application.properties中使用。

到目前为止,我所做的是在DockerFile内部添加MY_PROP ENV值,如下所示:

FROM maven:3-jdk-8-alpine

WORKDIR /usr/src/app

COPY . /usr/src/app
RUN mvn package

ENV PORT 5000
ENV MY_PROP testpropertyfromdocker
EXPOSE $PORT
CMD [ "sh", "-c", "mvn -Dserver.port=${PORT} spring-boot:run" ]

像这样设置我的application.properties

test.prop=${MY_PROP}

并尝试在基本的RestControntroller中使用它:

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${test.prop}")
    private String testProp;

    @GetMapping("/")
    String home() {
        return "My prop from docker: " + testProp;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

但是如果我尝试使用

构建我的Docker映像
docker build -t demo .

它在

上失败
java.lang.IllegalArgumentException: Could not resolve placeholder 'MY_PROP' in value "${MY_PROP}"

我也尝试过直接在IntelliJ中运行项目而不构建Docker映像,但是即使添加.env文件也遇到相同的错误。

如何将环境变量传递给Spring应用程序? 在IDE中进行调试时是否可以使用.env文件或类似文件,还是必须构建映像才能运行项目?

PS:我不认为这是Externalising Spring Boot properties when deploying to Docker的重复,或者至少答案应该是更完整的,因为我无法使我的配置按预期工作。

编辑 我更新了pom.xml,使其包含以下内容:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.2.2.RELEASE</version>
            <configuration>
                <environmentVariables>
                    <MY_PROP>testfromappprops</MY_PROP>
                </environmentVariables>
            </configuration>
        </plugin>
    </plugins>
</build>  

我做了一个干净的构建并重新同步Maven项目,但是即使通过IDE运行,它仍然失败。

编辑2 我将dmy DockerFile更新为使用java -jar:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENV MY_PROP testpropertyfromdocker
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

docker build -t demo .命令行正在运行,但是docker run demo提供了以下输出:

Error: Invalid or corrupt jarfile /app.jar

此外,当从IDE运行时(“运行”按钮),关于找不到环境变量,我仍然有同样的错误。

谢谢。

2 个答案:

答案 0 :(得分:0)

我认为该应用程序的application.properties必须完整,因为日志显示您的应用程序无法读取docker文件。

一旦正确定义了application.properties,就可以运行:

$ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker

有用的指南是here

答案 1 :(得分:0)

我认为这与您运行应用程序的方式有关。

由于您是Spring Boot的新手,所以请消除错误/确认代码的某些部分:

  1. @Value("${test.prop}") OK
  2. test.prop=${MY_PROP}中使用application.properties,只要文件放置在src/main/resourcessrc/main/resources/config
  3. ENV MY_PROP testpropertyfromdocker中的
  4. Dockerfile也没问题

现在,您的配置中可疑的是您实际运行项目的方式。通常,mvn软件包应创建docker应用程序的JAR(您应该为此使用spring-boot-maven-plugin)。但是这样做时,应该使用以下命令运行工件:    java -jar <YOUR_ARTIFACT.JAR>

相反,您选择了直接使用maven运行编译的代码库。但是,如果要在maven插件中传播env.variables或系统属性,则应指示插件这样做:

Here是有关环境变量的部分

Here是有关系统属性的部分

通常,与运行就绪工件相比,这种方式更多的是用于调试开发中的应用程序(最好使用上文所述的java -jar选项)。

因此,我怀疑只要它以这种方式启动应用程序,无论它在何种环境下运行(无论是否在docker中运行,无论在docker中,还是在IDE中)。变量不是“可用”的,因此spring boot根本看不到它们。

更新1

要验证这一点,请确保该环境。变量即使在没有弹簧的情况下也无法真正访问:

转到带有main批注的类的@SpringBootApplication方法。 它通常包含运行该应用程序的一行。但即使在此之前,也要尝试打印该env的值。 System.getenv("MY_PROP")

中的变量