通过可变的程序参数以灵活的方式启动Docker

时间:2019-06-02 08:05:40

标签: java bash docker-compose

我正在使用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级别与前面的示例进行比较-值已更改,但期望值必须相同。

有什么想法要解决吗?

P.S。

如果我在Dockerfile级别上做类似的事情-它可以工作:

ENV profiles=docker-test
ENTRYPOINT java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=$profiles -jar /app.jar

1 个答案:

答案 0 :(得分:1)

为此,您必须使用an .env file。 Docker Compose无法替换配置文件其他部分environment:entrypoint:中的变量。您可以检查在项目文件夹中运行docker-compose config时是否会看到profiles为空。

.env所在的目录中创建一个名为docker-compose.yml的文件。内容应为:

profiles=docker-test

那你应该很好。

最小示例:

  • docker-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