# 构建以及运行Springboot Docker镜像时的变量传递
Docker可以把我们的运行环境打包,然后我们只要run就可以了。大部分hello world都是这么写的。但都缺少了实际应用环节。以springboot为例,hello world的Dockerfile是这样的:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
我们实际使用的时候通常是
java -jar app.jar --spring.profiles.active=prod
也就是说,需要分环境。那直接
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar", "--spring.profiles.active=prod"]
这样确实可以直接打出prod的运行包。直接run就可以了。
当同时需要打test环境的时候,我重新写一个新的Dockerfile,改成test, 然后构建,就可以了。
docker build -t demo -f Dockerfile.test .
写两个Dockerfile看起来太傻逼了,构建时替换好了。
暴力替换 -- shell替换
准备好我们的Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar", "--spring.profiles.active=<active-profile>"]
然后我们的构建脚本:
function build(){
local env=$1
sed -i 's/<active-profile>/${env}/g' Dockerfile
docker build -t demo --build-arg JAR_FILE=demo.jar .
}
# 构建测试环境的包
build test
# 构建生产环境的包
build prod
# 运行
docker run -d demo
使用运行时指定参数
我们可以打一份镜像,在运行的时候传递profile来确定激活哪个配置文件,就和springboot原生一样。
ENTRYPOINT里是Docker容器的运行命令, CMD则是追加的参数,也就是说可以在后面加参数的。
docker run -d demo --spring.profiles.active=prod
运行时还可以传递环境变量,就是系统的环境变量。
$ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker
按照Springboot属性覆盖优先级,命令行优先级超过系统环境变量的,所以还是选择其中一种方式就好了。
构建时传递参数
如果我们开发模式是master模式,即所有的分发部署都是同一个分支master, 先将master部署到test环境,没问题后直接发布到prod。同样的镜像,只是运行时指定配置文件。那么,我们是可以走运行时配置的。这样,不同环境的K8s配置文件要修改对应的cmd命令。
我现在开发模式类似gitflow. dev分支开发结束后,merge到test分支,test分支发布到测试环境,测试环境ready后,再merge到master分支,master分支发布到生产环境。即,test环境和prod环境是不同的分支打出的镜像。这就使得在打镜像的时候就指定配置文件。可以选择上文的暴力方式,文本替换。
也可以使用Docker参数。
Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ARG profile=prod
ENV SPRING_PROFILES_ACTIVE ${profile}
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建
docker build -t demo --build-arg JAR_FILE=demo.jar --build-arg profile=test .
ARG
允许通过--build-arg
传递参数ENV
等同于docker run -e来设置系统环境变量,但优先级弱于-e
上述几种方案差不多解决了我的springboot容器化部署方式。在构建其他docker镜像也可以通过类似的方案去传递参数。
大部分Dockerfile都是有docker-entrypoint.sh
, 将启动逻辑都放在一个脚本里,然后
ENTRYPOINT ["/docker-entrypoint.sh"]
这样,我们也可以在启动的时候传递参数到脚本里,脚本按照shell接受参数就可以了。
参考
- https://spring.io/guides/gs/spring-boot-docker/
- https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html
# 构建以及运行Springboot Docker镜像时的变量传递的更多相关文章
- 使用Visual Studio 2017构建.Net Core的Docker镜像
1 Docker 镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...
- 在sun jdk 8镜像基础上构建maven 3的docker镜像
2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...
- 如何构建 Apache DolphinScheduler 的 Docker 镜像
继昨日发布第一个 [官方 Docker 镜像] 后,有几位小伙伴私信想自己进行编译,这里也将 Docker 的主要贡献者文禾同学整理的文档进行分享.以下是全文内容: 您能够在类 Unix 系统和 Wi ...
- 生成springboot docker镜像 并上传到阿里云镜像厂库
1 mvn package 2 创建Dockerfile ----------------------------------------------------------------------- ...
- 简述vue-cli 2.x和vue-cli 3+在项目构建、运行、编译执行时的区别
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14363272.html 关于VUE的项目,有个问题一直不是特别清楚 ,不同公司的项目 ...
- 使用 Docker 构建和运行自己的镜像
步骤 首先,从 GitHub 中克隆示例项目: git clone https://github.com/dockersamples/node-bulletin-board cd node-bulle ...
- IDEA中直接将 SpringBoot项目打包成 Docker镜像时 pom.xml的配置
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactI ...
- Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像
本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...
- 利用构建缓存机制缩短Docker镜像构建时间
在使用Docker部署PHP或者node.js应用时,常用的方法是将代码和环境镜像打包成一个镜像然后运行,一些云厂商提供了非常便捷的操作,只需要把我们的代码提交到VCS上,然后它们就会帮我们拉取代码并 ...
随机推荐
- Android平台第三方应用分享到微信开发
一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/ ...
- 正割函数(sec)
1. 定义 正割与余弦互为倒数,余割与正弦互为倒数.即: ⎧⎩⎨⎪⎪⎪⎪secθ=1cosθcscθ=1sinθ 也即在几何上,设 △ABC,∠C=90°,AC=b,BC=a,AB=c, 正割函数:s ...
- DDD的.NET开发框架
基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍 介绍 基于ABPZERO的多租户 (Sass) ...
- 组态档(configuration file)与建构档
组态档,或者叫 configuration file,配置文件.组态档是用一种建构软件专用的特殊编程语言写的 CMake 脚本. 使用组态档能改变程序的设置,而不用重新编译程序. CMake 的组态档 ...
- BeagleBone Black第八课板:建立Eclipse编程环境
BBB第八课板:建立Eclipse编程环境 最近建立了一个新的编程环境.感觉很方便,给大家分享.除了先前BBB董事会远程桌面直接写shell脚本或C外部程序,经Debain 7.5根据该制度还试图用编 ...
- 转义及编码(\u, \x)
首先前面的 \表示转义, \x:只是 16 进制的意思,后边跟两位,则表示单字节编码: \d:十进制:\o:八进制: 对于 \xaa ⇒ chr(0xaa) ⇒ chr(16*a+a) \u:unic ...
- 简单工厂 vs 工厂方法
设计模式,厂三姐妹是很重要的.现在,让我们来谈谈他们的故事. 简单工厂模式: client的实现须要依靠的是父类和工厂这个类,所以就把子类封装在父类里面,client直接调用父类和工厂类就能够了.可是 ...
- hdoj 5087 Revenge of LIS II 【第二长单调递增子】
称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O ...
- js 动态生成button 并设置click事件
<div id="MyDiv"></div> <script> function AddButton() { var MyDiv =docume ...
- js div的显示和隐藏
<head> <title></title> <style type="text/css"> div ...