Наличие переменной в вашем контейнере во время выполнения и наличие этой переменной в время запуска в вашем docker-compose.yml
- это разные вещи.Compose не может заменить переменные где-то в файле конфигурации переменными из раздела environment
файла - что вы пытаетесь сделать в части command
, но вам придется использовать .env
файл длясделайте эту работу.
Или, как вы это сделали, используйте синтаксис $$
, чтобы Compose не вычислял переменную , но позволял ей вызывать Shell в контейнере.
Переменные в части environment
доступны контейнеру.Вы можете проверить это на следующем минимальном примере:
version: "3.7"
services:
foo:
image: ubuntu
container_name: ubuntu
environment:
- foo=bar
command: sleep 3
nico@tuxedo:~/StackOverflow$ docker-compose up -d && docker exec ubuntu /bin/sh -c "env | grep foo"
Starting ubuntu ... done
foo=bar
Таким образом, ваше приложение внутри контейнера не должно иметь проблем с получениемэта переменная.
Почему именно command: echo $$foo
не работает, я не совсем уверен.Я считаю, что если вы используете echo
в качестве ENTRYPOINT
(поскольку в Dockerfile нет других ENTRYPOINT
определенных ), то при запуске контейнера Shell не будет, поскольку вы перезаписываете значение по умолчанию/bin/bash
.echo
само по себе, похоже, не может читать переменные из среды, когда нет Shell, «обернутого вокруг него».Хотя переменные явно присутствуют (проверьте это с помощью commmand: env
и docker-compose up
), echo
не знает, как их получить.
Если у кого-то есть хорошее объяснение этому, я оченьрад прочитать это.:)