java - 使用可变程序参数以灵活的方式启动 docker
问题描述
我正在使用 docker-compose v3。最有趣的配置部分是:
entrypoint:
- java
- -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker-test -jar /app.jar
请注意-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker-test -jar /app.jar
- 活动的个人资料是docker-test
。这个配置对我有用。试图改进一个,将配置文件值移动到单独的变量:
environment:
- profiles=docker-test
并通过改进更新java
参数:
- -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=$profiles -jar /app.jar
程序失败。检查日志:
INFO 1 --- [ main] c.s.n.d.m.d.DiscoveryServiceApplication : No active profile set, falling back to default profiles: default
这意味着 docker 改进在 java 级别上不可见,似乎变量$profiles
没有被其值替换。将 java 级别与前面的示例进行比较 - 值已更改但期望值必须相同。
有什么想法可以解决吗?
附言
如果我在Dockerfile
级别上做类似的事情 - 它有效:
ENV profiles=docker-test
ENTRYPOINT java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=$profiles -jar /app.jar
解决方案
您必须为此使用.env
文件。Docker Compose 无法替换environment:
配置文件其他部分中的变量(entrypoint:
在这种情况下)。您可以检查当您docker-compose config
在项目文件夹中运行时,您会看到它profiles
是空的。
.env
在您所在的同一目录中创建一个名为的文件docker-compose.yml
。内容应该是:
profiles=docker-test
那么你应该很高兴。
最小的例子:
- 码头工人-compose.yml:
version: "3.7"
services:
foo:
image: alpine
entrypoint:
- echo
- "$bar"
- .env
bar="i was correctly read"
结果是:
nico@tuxedo:~/StackOverflow$ docker-compose config
services:
foo:
entrypoint:
- echo
- '"i was correctly read"'
image: alpine
version: '3.7'
nico@tuxedo:~/StackOverflow$ docker-compose up
Starting stackoverflow_foo_1 ... done
Attaching to stackoverflow_foo_1
foo_1 | "i was correctly read"
stackoverflow_foo_1 exited with code 0
推荐阅读
- r - Spearman 相关性和拆分 1 个变量
- python-3.x - 未能部署 Travis CI `Python`
- android - 使用搜索视图的特定标题(从 api 获取)?
- java - 如何增加标头大小限制Tomcat Java
- php - 使用 PHP 将 Oracle BLOB 导入 MySQL 时,OCI-Lob 无法转换为字符串错误
- vb.net - 在文本框中显示一个值,该值链接到我的 ComboBox 中的字符串
- c++ - 如何删除除ArduinoSTL的向量函数之外的所有函数
- c++ - 无需检查即可快速将标准输入读入缓冲区
- php - 从不同的设备添加到相同的 SESSION 数组
- javascript - 在 Vue SPA 站点中重新加载同一页面