【问题标题】:Docker file ENV variable substitutionDocker 文件 ENV 变量替换
【发布时间】:2021-01-03 11:10:08
【问题描述】:

我有一个案例,其中同一 java spring boot 应用程序的 docker 映像/容器构建在不同的服务器(DEV 服务器、QA 服务器、PROD 服务器)上。但是,在我的 Dockerfile 中,我有一个 ENTRYPOINT 行,如下所示:

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

但是当我在 QA 或 PROD 时,我需要一种方法来传递正确的“-Dspring.profiles.active=development”。

我注意到,如果我在服务器上发出这个 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 访问权限,只有用户访问权限。

【问题讨论】:

    标签: java spring-boot docker dockerfile


    【解决方案1】:

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

    Docker 文件

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

    Docker 运行

    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
    

    【讨论】:

      【解决方案2】:

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

      例如

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

      如果您有一个环境变量列表,那么您可以简单地创建一个 .env 文件并将所有变量添加到其中,并且在 docker run 命令中可以参考下面的 env 文件

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

      你的 .env 文件可能在哪里

      ZZ_ENVIRONMENT=PROD
      ENV_VAR2=value2
      

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多