我正在使用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
答案 0 :(得分:1)
为此,您必须使用an .env
file。 Docker Compose无法替换配置文件其他部分environment:
中entrypoint:
中的变量。您可以检查在项目文件夹中运行docker-compose config
时是否会看到profiles
为空。
在.env
所在的目录中创建一个名为docker-compose.yml
的文件。内容应为:
profiles=docker-test
那你应该很好。
最小示例:
version: "3.7"
services:
foo:
image: alpine
entrypoint:
- echo
- "$bar"
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