Escape $ в переменной, переданной команде запуска Docker - PullRequest
0 голосов
/ 04 мая 2018

Я не могу понять, как избежать знака доллара, чтобы получить доступ к переменной, определенной в среде в Docker, при выполнении команды из make-файла.

Это минимальное представление моей установки, и я пытаюсь повторить /mypath

define create-test
so-test-$1:
    docker run \
        --rm \
        -t \
        --env SRC="/mypath" \
        ubuntu:xenial \
        /bin/bash -c "$2"
endef


$(eval $(call create-test,1,echo $SRC ))
$(eval $(call create-test,2,echo $$SRC ))
$(eval $(call create-test,3,echo $$$$SRC ))
$(eval $(call create-test,4,echo $$$$$$$$SRC ))

Выходы

$ make so-test-1
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ make so-test-2
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo RC "
RC
$ make so-test-3
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo $SRC "

$ make so-test-4
docker run --rm -t --env SRC="/mypath" ubuntu:xenial /bin/bash -c "echo $$SRC "
6526SRC

Я знаю, что переменная окружения установлена, потому что она показывает, если я вызову env в контейнере.

Как я должен экранировать переменную SRC, чтобы она раскрывалась внутри оболочки, запущенной в контейнере докера?

1 Ответ

0 голосов
/ 04 мая 2018

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

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

docker run \
    --rm \
    -t \
    --env SRC="/mypath" \
    ubuntu:xenial \
    /bin/bash -c "echo $SRC"

Это не сработает. Почему бы и нет? Потому что оболочка раскроет все переменные в двойных кавычках, прежде чем вызовет команду. Это означает, что ваша команда docker фактически получает это в качестве аргументов:

docker run \
    --rm \
    -t \
    --env SRC="/mypath" \
    ubuntu:xenial \
    /bin/bash -c "echo "

потому что оболочка раскрывает переменную $SRC, которая пуста (она не будет установлена ​​до запуска docker, но это расширение выполняется оболочкой до запуска docker).

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

docker run \
    --rm \
    -t \
    --env SRC="/mypath" \
    ubuntu:xenial \
    /bin/bash -c 'echo $SRC'

Теперь вы сможете заставить свой рецепт make-файла работать так, как вы ожидаете.

...