我有一种情况,同一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访问服务器的权限,只有用户访问权限。
答案 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