通过telegram 传递变量_Docker随时随地玩转变量

本文详细介绍了Dockerfile中ARG和ENV命令的使用,以及它们在传递变量到SpringBoot应用JVM参数时的区别。ARG只在构建阶段有效,而ENV则能在容器运行时保留。在启动容器时,可以通过`docker run -e`来覆盖Dockerfile内的环境变量。此外,ENTRYPOINT的shell形式和exec形式也会影响环境变量的使用,必须注意二者在处理环境变量时的不同行为。
摘要由CSDN通过智能技术生成
ece8a757ecc54865ee8d7b974433e9db.png

Docker中传递变量主要使用ARG和ENV,虽然功能相同,但是他们的作用范围是不一样的。下面我们结合SpringBoot启动的JVM参数来详细了解下。通过本文介绍,我们可以知道这两个命令的具体使用方式。

ARG传递变量

ARG只在Dockerfile中生效,且在docker build阶段生效,构建好的镜像内不存在此环境变量。意味着在容器启动后ARG定义的变量已经无效,如果想让其生效,需要将其赋值给ENV。

#Dockerfilevim DockerfileFrom javaVOLUME /tmpARG JAR_FILE=*.jarCOPY ${JAR_FILE} helloworld.jarARG OPTS="-Xmx512m -Xms512m -Dspring.profiles.active=test"ENV JAVA_OPTS=${OPTS}ENTRYPOINT ["/bin/sh","-c","java $JAVA_OPTS -jar /helloworld.jar"]#builddocker build -t helloworld:v1 .#rundocker run -p 8080:8080 --name helloworld helloworld:v1#docker exec -it 29a90e0be2b3 /bin/bashroot@29a90e0be2b3:/# ps -ef|grep javaroot 1 0 0 13:22 ? 00:00:00 /bin/sh -c java $JAVA_OPTS -jar /helloworld.jarroot 6 1 10 13:22 ? 00:00:07 java -Xmx512m -Xms512m -Dspring.profiles.active=test -jar /helloworld.jarroot 49 39 0 13:23 pts/0 00:00:00 grep java

此时通过ARG定义的变量OPTS,已经成功通过ENV环境变量作为java启动参数。

当然我们也可以在docker build --build-arg 传递ARG变量,此时将覆盖dockerfile内部的ARG变量。

# --build-arg 定义变量docker build --build-arg OPTS="-Xmx216m -Xms216m -Dspring.profiles.active=test" -t helloworld:v1 .docker run -p 8080:8080 -d --name helloworld1 helloworld:v1docker exec -it 9aed3266d244 /bin/bashroot@9aed3266d244:/# ps -ef|grep javaroot 1 0 0 13:30 ? 00:00:00 /bin/sh -c java $JAVA_OPTS -jar /helloworld.jarroot 6 1 23 13:30 ? 00:00:07 java -Xmx216m -Xms216m -Dspring.profiles.active=test -jar /helloworld.jarroot 45 39 0 13:31 pts/0 00:00:00 grep java

此时可以看到"-Xmx216m -Xms216m -Dspring.profiles.active=test"已经覆盖dockerfile中的ARG变量。

ENV传递环境变量

Dockerfile中可以通过ENV来设置环境变量,并且可以在容器启动后使用。

#Dockerfilevim DockerfileFrom javaVOLUME /tmpARG JAR_FILE=*.jarCOPY ${JAR_FILE} helloworld.jarENV JAVA_OPTS="-Xmx512m -Xms512m -Dspring.profiles.active=test"ENTRYPOINT ["/bin/sh","-c","java $JAVA_OPTS -jar /helloworld.jar"]#builddocker build -t helloworld:v1 .#rundocker run -p 8080:8080 --name helloworld helloworld:v1#sudo docker exec -it 301aced67bb4 /bin/bashroot@301aced67bb4:/# ps -ef|grep javaroot 1 0 0 12:24 ? 00:00:00 /bin/sh -c java $JAVA_OPTS -jar /helloworld.jarroot 6 1 22 12:24 ? 00:00:10 java -Xmx512m -Xms512m -Dspring.profiles.active=test -jar /helloworld.jarroot 45 39 0 12:24 pts/0 00:00:00 grep java

通过以上我们可以看出容器启动后,在dockerfile中通过ENV定义的环境变量JAVA_OPTS已经被成功应用到java启动命令中。

docker run -e传递环境变量

我们也可以使用docker run 启动容器是,通过-e参数来传递变量,这时它会覆盖Dockfile内部通过ENV定义的环境变量。

  1. ENV定义变量
#Dockerfilevim DockerfileFrom javaVOLUME /tmpARG JAR_FILE=*.jarCOPY ${JAR_FILE} helloworld.jarENV JAVA_OPTS="-Xmx512m -Xms512m -Dspring.profiles.active=test"ENTRYPOINT ["java","-jar","/helloworld.jar"]#builddocker build -t helloworld:v1 .#rundocker run -p 8080:8080 --name helloworld helloworld:v1
  1. 查看容器内部环境变量
#docker exec 3ca86b42c732 envPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=3ca86b42c732JAVA_OPTS=-Xmx512m -Xms512m -Dspring.profiles.active=testLANG=C.UTF-8JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64JAVA_VERSION=8u111JAVA_DEBIAN_VERSION=8u111-b14-2~bpo8+1CA_CERTIFICATES_JAVA_VERSION=20140324HOME=/root

通过以上命令我们可以看到容器默认的环境变量,也可以通过"docker run -e"方式添加自定义环境变量:

#通过docker run -e 传递环境变量docker run -e JAVA_OPTS='-Xmx256m -Xms256m -Dspring.profiles.active=test' -p 8080:8080 -d --name helloworld helloworld:v1#docker exec fed826eb25fa envPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=fed826eb25faJAVA_OPTS='-Xmx256m -Xms256m -Dspring.profiles.active=test'LANG=C.UTF-8JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64JAVA_VERSION=8u111JAVA_DEBIAN_VERSION=8u111-b14-2~bpo8+1CA_CERTIFICATES_JAVA_VERSION=20140324HOME=/root

此时我们看到通过JAVA_OPTS自定义的环境变量为'-Xmx256m -Xms256m -Dspring.profiles.active=test',已经覆盖了ENV定义的环境变量,剩下的工作就是在容器内部来使用JAVA_OPTS 变量。

#修改Dockerfilevim DockerfileFrom javaVOLUME /tmpARG JAR_FILE=*.jarCOPY ${JAR_FILE} helloworld.jarENV JAVA_OPTS="-Xmx512m -Xms512m -Dspring.profiles.active=test"ENTRYPOINT ["java","$JAVA_OPTS","-jar","/helloworld.jar"]#builddocker build -t helloworld:v2 .#rundocker run -e JAVA_OPTS='-Xmx256m -Xms256m -Dspring.profiles.active=test' -p 8080:8080 -d --name helloworld2 helloworld:v2

此时helloworld2容器并没有正常启动,报错如下:

#docker logs 335ac14921d1Error: Could not find or load main class $JAVA_OPTS

看来JAVA_OPTS并没有接收到环境变量参数,而将其直接识别为字符串$JAVA_OPTS,因此会被java启动命令识别为class报错,这是为什么呢?

这就要从ENTRYPOINT的shell形式和exec形式说起,这两种形式的区别在于exec形式不像shell那样能够调用环境变量,因此我们必须使用shell形式

#vim DockerfileFrom javaVOLUME /tmpARG JAR_FILE=*.jarCOPY ${JAR_FILE} helloworld.jarENV JAVA_OPTS="-Xmx512m -Xms512m -Dspring.profiles.active=test"ENTRYPOINT ["/bin/sh","-c","java $JAVA_OPTS -jar /helloworld.jar"]#builddocker build -t helloworld:v2 .#rundocker run -e JAVA_OPTS="-Xmx256m -Xms256m -Dspring.profiles.active=test" -p 8080:8080 -d --name helloworld2 helloworld:v2#测试curl 127.0.0.1:8080Hello world

此时我们启动容器,可以看到正常访问。由此我们得知通过docker run -e传输环境变量不能使用ENTRYPOINT的exec形式。

总结

通过本文的讲解,我们熟悉了docker部署SpringBoot项目时如何传递JVM参数,同时触类旁通,帮我们更好的在以后深入学习docker时打好基础。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值