Docker переменные изображения env перезаписываются на локальной машине - PullRequest
0 голосов
/ 09 апреля 2020

Почему при проверке env для создаваемого мной изображения я получаю переменные среды изображения в списке, как и ожидалось, но когда я пытаюсь получить доступ к одной из этих переменных env (например, $ PATH), я получаю вместо этого на моем локальном компьютере выводится переменная окружения?

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

Dockerfile:

FROM node:12.13.0 

ENV PATH="${PATH}:/custom-path/goes-here"

Команды:

  1. docker build . -tag env-test
  2. docker run env-test /bin/bash -c "env"
  3. docker run env-test /bin/bash -c "$PATH"

Ожидаемый результат от двух последних команд.

docker run env-test /bin/bash -c "env".
...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here
...
docker run evn-test /bin/bash -c "echo $PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here

Фактический вывод из двух последних команд

docker run env-test /bin/bash -c "env".
...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here
...
docker run evn-test /bin/bash -c "echo $PATH"
/Users/local-machine-user/Downloads/google-cloud-sdk/bin:/Users/local-machine-user/.nvm/versions/node/v12.16.1/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/local-machine-user/Downloads/google-cloud-sdk/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin

Результат выполнения echo $PATH для созданного образа возвращает переменную $ PATH моей локальной машины. Какая?

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Скажем, вы пытаетесь запустить свой третий пример

docker run env-test /bin/bash -c "echo $PATH"

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

Обычно полезный трюк - просто поставить echo в начале команды

echo docker run env-test /bin/bash -c "echo $PATH"

Это покажет вам команда, которая была бы запущена, но на самом деле не выполнялась.

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

docker run env-test /bin/sh -c 'echo $PATH'
docker run env-test /bin/sh -c "echo \$PATH"

будут работать одиночные кавычки или экранирование backsla sh. В первую очередь я пытаюсь выполнить скрипт для образа docker, для которого требуются те переменные среды, которые я установить в образе

Наилучший способ добиться этого - написать обычный скрипт оболочки и COPY добавить его в изображение. Это сохраняет оба уровня цитирования и путаницу, вокруг которой оболочка обрабатывает такие вещи, как переменные. Если вы не можете изменить образ, альтернативой является привязка скрипта с хоста.

# If the script is in the image
docker run --rm env-test path-echoer.sh

# If not
docker run --rm -v $PWD:/scripts env-test /scripts/path-echoer.sh
1 голос
/ 09 апреля 2020

Вы должны экранировать знак доллара при использовании $PATH в строке - "echo \$PATH"

В результате при запуске этой строки:

docker run evn-test /bin/bash -c "echo $PATH"

Bash первый перевод $PATH, затем передает эту строку в контейнер docker. Таким образом, команда, запускаемая внутри контейнера:

docker run evn-test /bin/bash -c "echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...