根据docker环境变量切换spring配置文件不起作用

时间:2019-01-17 17:33:03

标签: spring-boot docker docker-compose

docker-compose.yml:

services:
  server:
    image: server:latest
    environment:
    - SPRING_PROFILES_ACTIVE=dev
    ports:
    - 8080:8080
    - 18080:18080

Dockerfile:

FROM openjdk:8-jre-alpine

ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
    SLEEP=0 \
    JAVA_OPTS="" \

RUN adduser -D -s /bin/sh server
WORKDIR /home/server

ADD entrypoint.sh entrypoint.sh
RUN chmod 755 entrypoint.sh && chown server:server entrypoint.sh
USER server

ENTRYPOINT ["./entrypoint.sh"]
# expose server ports
EXPOSE 8080 18080

ADD *.jar server.jar

entrypoint.sh:

#!/bin/sh

echo "The application will start in ${SLEEP}s..." && sleep ${SLEEP}
exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar "${HOME}/server.jar" "$@"

我有3个application.yml:application.ymlapplication-dev.ymlapplication-prod.yml,它们与数据库地址不同。

但是当我运行docker-compose up时,服务器始终使用默认设置,即使我在 docker-compose.yml 中提到活动配置文件是dev。

我想知道如何在docker-compose文件中启用其他配置文件。 谢谢。

修改 server.jar 文件是使用gradle的assemble构建的。

2 个答案:

答案 0 :(得分:0)

.yaml文件与.properties文件的处理方式不同。

属性将查找名称为活动配置文件的文件:
application-dev.properties
application-prod.properties
...

yaml文件,但是您将所有配置文件存储在单个文件中,并以“ ---”分隔。

示例[使用您现有的docker-compose.yaml]:

application.yaml:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
{
    @Autowired
    private TokenStore tokenStore;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)
    { 
        resources.tokenStore(tokenStore)
                .resourceId(SecurityConstant.RESOURCE_ID); 
    }

    @Override
    public void configure(HttpSecurity http) throws Exception
    { 
        http.formLogin().disable()
            .anonymous().disable()
            .authorizeRequests()
            .antMatchers(Uri.DIET + "/**").authenticated()
            .anyRequest()
            .authenticated()
            .and()
            .exceptionHandling()
            .accessDeniedHandler(new OAuth2AccessDeniedHandler());
    }
}

答案 1 :(得分:0)

添加命令:命名空间,如下所示:

services:
  server:
    image: server:latest
    environment:
    - SPRING_PROFILES_ACTIVE=dev
    ports:
    - 8080:8080
    - 18080:18080
    command: --spring.profiles.active=prod

在容器运行之后,它将添加到您的入口点,并且Spring Boot将提取此配置文件。它将像这样执行:

Java -jar yourJar.jar --spring.profiles.active =产品。

并且如果要在公司的各种环境中以及针对各种环境中运行项目应用程序,则需要配置不同的kubernetes集群,然后在不同的kubernetes环境中为您的应用程序配置此设置。意味着在qa环境中运行docker映像时,qa Kubernetes集群将通过--spring.profiles.active = qa 并类似地登台和Prod集群。

即使您要使用环境变量,也要使用

exec java ${JAVA_OPTS}
-Dspring.profiles.active={your envronment variable name describe in docker compose} -Djava.security.egd=file:/dev/./urandom -jar "${HOME}/server.jar" "$@"

在github上检查: https://github.com/vaneetkataria/MicroService_Architecture/blob/master/docker-compose.yml