关于Spring boot/cloud 在Docker -e中不能识别传入的环境变量参数的问题

Docker 传入环境变量是 -e "spring.profiles.active=dev",但是在更换了java底包后,发现传入的参数没有效果,使用-e "SPRING_PROFILES_ACTIVE=dev" 居然有效果。后来发现,spring框架在默认值的时候,@vlaue("${spring.profiles.active:SPRING_PROFILES_ACTIVE.}",这样,就可以传入了?

但是为什么不能获取带.的系统变量了呢?

后来对比Dockerfile发现,最后的CMD命令有些变化。

不能是被的Dockerfile使用的是 :
CMD java -jar app.jar
以前的写法
CMD ["java","-jar", "app.jar"]

难道是这两者的区别?

在网搜索一番
http://unixman.blog.51cto.com/10163040/1677744

后面的写 相当于shell form执行,类似于/bin/bash -c ,这种执行下,不支持环境变量中带有.

至于为什么??

请看
https://unix.stackexchange.com/questions/93532/exporting-a-variable-with-dot-in-it

附录:
在网搜索一番
http://unixman.blog.51cto.com/10163040/1677744
Dockerfile 中CMD 和 ENTRYPOINT指令

CMD 指令的三种格式:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

推荐格式,类似于执行exec CMD ["exectuable","param1","param2"]
作为entrypoint指令的参数 CMD ["param1","param2"]
类似于执行 /bin/bash -c CMD command param1 param2
CMD指令用于Dockerfile 文件中时,只有最近的一条才会生效(存在多条CMD无有意义)。

ENTRYPOINT 指令的两种格式:
ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)
ENTRYPOINT command param1 param2 (shell form)

推荐格式,类似于执行 exec ENTRYPOINT ["executable", "param1", "param2"]
类似于执行 /bin/bash -c ENTRYPOINT command param1 param2
ENTRYPOINT 指令用于Dockerfile文件中时,只有最近一条才会生效(存在多条CMD指令无意义)

共同点:
1、CMD 和 ENTRYPOINT 指令用在Dockerfile文件中时,都是最近一条指令生效
2、有两种指令形式是重合的。
3、都可以在创建container 时被覆盖

异同点:
1、ENTRYPOINT通常用于在创建container时执行一个启动的点,而这个功能是cmd所不能取代的
2、CMD 指令的其中一种形式是ENTRYPOINT 指令的参数,例如Dockerfile:

123
FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]

被覆盖举例:
CMD 被覆盖的例子,假如生成一个image 的 dockerfile 文件为如下格式:

12
FROM ubuntuCMD ["/usr/bin/wc","--help"]

docker build -t ubuntu:cmd .
创建container 时:
docker run -it ubuntu:cmd pwd # 此时pwd 指令就覆盖了 /usr/bin/wc --help 指令而显示的为一个路径。

ENTRYPOINT被覆盖的例子,假如生成一个image 的 dockerfile 文件的格式如下:

12345
FROM debian:stableRUN apt-get update && apt-get install -y --force-yes apache2EXPOSE 80 443VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

docker build -t debian:apache .

创建container 时:
docker run -d --entrypoint="/usr/sbin/nginx" debian:apache "-g 'daemon off;'"
此时 /usr/sbin/apache2ctl -D FOREGROUND 将被 /usr/sbin/nginx -g "daemon off;" 覆盖
且这里,-g "daemon off" 为 CMD指令作为 ENTRYPOINT指令的参数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,699评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,946评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,368评论 19 139
  • 所有事情皆为因果,种瓜得瓜种豆得豆,选择了一人独闯就别去期待他人的关爱,没什么好不舍的,没什么好遗憾的,好好睡吧,...
    呆子啊呆子阅读 103评论 0 0

友情链接更多精彩内容