Передайте ENV в контейнер Docker, запустив одну команду - PullRequest
2 голосов
/ 29 мая 2020

Это печатает пустым:

docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo $HELLO"

Однако это работает:

docker run --rm -it --env HELLO="world" ubuntu:18.04 bash
# in the container
echo $HELLO

HELLO кажется переданным в контейнер, хотя:

docker run --rm --env HELLO="world" ubuntu:18.04 env

Почему первая команда не видит HELLO? Что мне не хватает?

Ответы [ 2 ]

5 голосов
/ 29 мая 2020

Из-за двойных кавычек, $HELLO будет вычисляться самим docker хостом после выполнения команды перед переходом внутрь контейнера. Таким образом, вам нужно либо избежать знака доллара ($), используя Backsla sh (\), который сообщает bash, что $ является частью самой команды и не нуждается в оценке с помощью текущая оболочка (в нашем случае это хост docker) или используйте одинарные кавычки (''), например:

Используя одинарные кавычки

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
world

Использование Backsla sh для выхода

$ docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"
world
0 голосов
/ 29 мая 2020

Причина, по которой вы не видите того, чего ожидаете, заключается в том, что вещи оцениваются до того, как вы ожидаете, что они будут оценены.

Когда вы запускаете:

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.

Что вы хотите сделать, так это запретить вашей оболочке вычислять переменную. Вы можете сделать это двумя способами:

  1. Вы можете использовать одинарные кавычки вместо двойных кавычек. Ваша оболочка не разбирает его; он будет передан в bash внутри контейнера как есть:

    docker run --rm --env HELLO="world" ubuntu:18.04 bash -c 'echo $HELLO'
    
  2. Вы можете избежать $, чтобы не оценивать его в этой оболочке и позволить bash внутри контейнера docker оцените его:

    docker run --rm --env HELLO="world" ubuntu:18.04 bash -c "echo \$HELLO"
    
...