Docker文件ENV变量替换

时间:2020-09-16 15:15:30

标签: java spring-boot docker dockerfile

我有一种情况,同一java spring boot应用程序的docker映像/容器构建在单独的服务器(DEV服务器,QA服务器,PROD服务器)上。但是,在我的Dockerfile中,我有一条ENTRYPOINT行,如下所示:

ENTRYPOINT ["java","-jar","-DskipTests","-Dspring.profiles.active=development","some.jar",">some.log","2>someerror.log"]

但是我需要一种方法来传递正确的“ -Dspring.profiles.active = development”以进行质量检查或PROD。

我注意到,如果我在服务器上发出此docker命令(例如QA):

docker exec <container id> env | grep V 

然后我可以清楚地看到有一个环境变量定义为:

ZZ_ENVIRONMENT=QA

看到这一点,我正在寻找一种方式,以便在Dockerfile中,我可以使用以下信息,例如:

if ZZ_ENVIRONMENT=QA then 
ENTRYPOINT ["java","-jar","-DskipTests","-Dspring.profiles.active=qa","some.jar",">some.log","2>someerror.log"]

if ZZ_ENVIRONMENT=PROD then 
ENTRYPOINT ["java","-jar","-DskipTests", Dspring.profiles.active=production","some.jar",">some.log","2>someerror.log"]

else
ENTRYPOINT ["java","-jar","-DskipTests","-Dspring.profiles.active=development","some.jar",">some.log","2>someerror.log"]

这可能吗?如果是这样,我将很高兴能效法的榜样。如果这样做是错误的方法,请告知最佳方法。请注意:我没有sudo访问服务器的权限,只有用户访问权限。

2 个答案:

答案 0 :(得分:0)

您可以在docker run命令中启动docker容器时传递环境变量。

例如

/:repository/:branch/commits?latest=true

如果您有环境变量列表,则只需创建一个.env文件并将所有变量添加到其中,然后在docker run命令中可以如下所示引用该环境文件

docker run --env ZZ_ENVIRONMENT=PROD --env ENV_VAR2=value2 <docker_image_name>

.env文件所在的位置

docker run --env-file .env <docker_image_name>

答案 1 :(得分:0)

解决此问题的最佳方法是在DockerFile中代替此逻辑,您可以直接在环境文件中使用SPRING_PROFILES_ACTIVE变量。

Docker文件

ENTRYPOINT ["java","-jar","-DskipTests""some.jar",">some.log","2>someerror.log"]

Docker Run

docker run -e "SPRING_PROFILES_ACTIVE=qa" -p 8080:8080 -t test-image:v1

docker run -e "SPRING_PROFILES_ACTIVE=production" -p 8080:8080 -t test-image:v1

或者,您可以像下面那样探索docker compose(更可维护的方法)

docker-compose.yml

version: '3'
services:
  spring-boot-service:
    image: test-image:v1
    env_file:
      - spring-boot-service.env
    ports:
      - 8080:8080

spring-boot-service.env

SPRING_PROFILES_ACTIVE=production