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接受参数就可以了。

参考

# 构建以及运行Springboot Docker镜像时的变量传递的更多相关文章

  1. 使用Visual Studio 2017构建.Net Core的Docker镜像

    1 Docker  镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...

  2. 在sun jdk 8镜像基础上构建maven 3的docker镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...

  3. 如何构建 Apache DolphinScheduler 的 Docker 镜像

    继昨日发布第一个 [官方 Docker 镜像] 后,有几位小伙伴私信想自己进行编译,这里也将 Docker 的主要贡献者文禾同学整理的文档进行分享.以下是全文内容: 您能够在类 Unix 系统和 Wi ...

  4. 生成springboot docker镜像 并上传到阿里云镜像厂库

    1 mvn package 2 创建Dockerfile ----------------------------------------------------------------------- ...

  5. 简述vue-cli 2.x和vue-cli 3+在项目构建、运行、编译执行时的区别

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14363272.html 关于VUE的项目,有个问题一直不是特别清楚 ,不同公司的项目 ...

  6. 使用 Docker 构建和运行自己的镜像

    步骤 首先,从 GitHub 中克隆示例项目: git clone https://github.com/dockersamples/node-bulletin-board cd node-bulle ...

  7. IDEA中直接将 SpringBoot项目打包成 Docker镜像时 pom.xml的配置

    <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactI ...

  8. Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像

    本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...

  9. 利用构建缓存机制缩短Docker镜像构建时间

    在使用Docker部署PHP或者node.js应用时,常用的方法是将代码和环境镜像打包成一个镜像然后运行,一些云厂商提供了非常便捷的操作,只需要把我们的代码提交到VCS上,然后它们就会帮我们拉取代码并 ...

随机推荐

  1. Linux经常使用的命令(两) - cd

    Linux cd 命令能够说是Linux中最主要的命令语句,其它的命令语句要进行操作,都是建立在使用 cd 命令上的.所以,学习Linux 经常使用命令.首先就要学好 cd 命令的用法技巧. 1. 命 ...

  2. Mybatis使用TypeHandler实现数据的加解密转换

    参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html   前段时间收到这么个需求:为安全起见,要求在数据库 ...

  3. [C/C++]_[VS2010使用源代码UTF8中国字符串转码ANSI问题]

    场景: 1.思想vs设置源文件UTF8编码,的代码串中国出现在它必须是utf8编码.不幸的是没有,假设源代码出现在中国字符串,在内存公交码ANSI编码. Unicode(UTF8) 代码页(65001 ...

  4. WPF:WebBrowser提示 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容

    原文:WPF:WebBrowser提示 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://bl ...

  5. Some Very Good VC++/MFC Resources Besides Codeproject.com

    Some Very Good VC++/MFC Resources Besides Codeproject.com http://www.naughter.com/ (VC++/MFC huge co ...

  6. 学习git命令

    1.git init @创建仓库 2.git add  filename @添加文件到缓存区 3.git commit -m"注释说明"   @提交修改内容 4.git statu ...

  7. 细数Windows 的那些小技巧!

    以下整理自知乎 Windows 有哪些你相见恨晚的技巧?和Quora(英文版) What are some secret tricks you should know about Windows? 等 ...

  8. Wireshark基本介绍和学习TCP三次握手 专题

    wireshark有两种过滤器: 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.显示过滤器(DisplayFilters):用于在捕捉结果中进行详细查找. 捕捉过 ...

  9. WPF 4 DataGrid 控件(进阶篇一)

    原文:WPF 4 DataGrid 控件(进阶篇一)      上一篇<WPF 4 DataGrid 控件(自定义样式篇)>中,我们掌握了DataGrid 列表头.行表头.行.单元格相关的 ...

  10. PostSharp-4.3.33安装包_KeyGen发布

    PostSharp-4.3.33安装包_KeyGen发布 请低调使用. PostSharp安装及注册步骤截图.rar 请把浏览器主页设置为以下地址支持本人.https://www.duba.com/? ...