Я использую 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
это означает, что улучшение докера не видно на уровне 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
Тогда вы должны быть готовы идти.
Минимальный пример:
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
Почему в вашем случае не работает? Я добавлю минимальный пример к моему ответу. По другим вопросам обращайтесь к документации Docker, на которую я уже ссылался в ответе. Там вы найдете более подробные ответы, чем я мог бы дать здесь.
Кажется, я ошибся с вашей рекомендацией. Я пропустил "
Не могли бы вы описать жизненный цикл, возможно, в своем ответе (...какие-то особые условия, поведение жизненного цикла в зависимости от него и т. д.)? Я был проинформирован о
.envранее, но этот подход, к сожалению, не работает для описанного случая.