首页 > 解决方案 > 使用可变程序参数以灵活的方式启动 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

标签: javabashdocker-compose

解决方案


您必须为此使用.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

推荐阅读