Причина, по которой вы не видите того, чего ожидаете, заключается в том, что вещи оцениваются до того, как вы ожидаете, что они будут оценены.
Когда вы запускаете:
docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo $HELLO"
Действительно ничем не отличается от bash, чем:
echo "echo $HELLO"
Оболочка (bash
) анализирует двойные кавычки ("
) и вещи внутри них. Он видит "echo $HELLO"
и заменяет переменную $HOME
своим значением. Если $HOME
не определен, это оценивается как echo
.
Итак,
echo "echo $HELLO"
анализируется и оценивается вашей оболочкой. Что затем просто запускает это в конце:
echo "echo "
Итак, "echo $HELLO"
в вашей команде docker оценивается как "echo "
и , что , что передается в docker command.
Что вы хотите сделать, так это запретить вашей оболочке вычислять переменную. Вы можете сделать это двумя способами:
Вы можете использовать одинарные кавычки вместо двойных кавычек. Ваша оболочка не разбирает его; он будет передан в bash
внутри контейнера как есть:
docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
Вы можете избежать $
, чтобы не оценивать его в этой оболочке и позволить bash
внутри контейнера docker оцените его:
docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"