Как передать один backsla sh внутри переменной окружения в docker - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь передать переменную окружения в docker. Эта переменная должна быть (повторно) интерпретирована приложением, работающим внутри docker.

Предполагается, что эта переменная содержит разделенный запятыми список, но мои элементы списка содержат сами запятые.

Я пытаюсь экранировать запятые внутри элементов списка и использую неэкранированные запятые для разделения элементов.

Мои элементы списка являются отличительными именами некоторых сертификатов (следовательно, они содержат запятые).

Я попытался передать переменную окружения, заключенную в одинарные, двойные кавычки, экранировать мой backsla sh и удалить его. Ни один из этих сценариев ios не оставил мне единственной обратной косой черты sh:

# Single quote, single backslash
me@me:~$ docker run --rm --name commatest -d -e PSEUDO_LIST='CN=cn\,OU=ou,CN=cn2\,OU=ou2' busybox sleep 1000; docker inspect commatest | grep PSEUDO_LIST; docker stop commatest;
ed09a7570c83a6a2d9b7d888eb7c83ee763a7a60f1222d1ad0ba4e070cb73de6
                "PSEUDO_LIST=CN=cn\\,OU=ou,CN=cn2\\,OU=ou2",
commatest

# Single quote, double backslash
me@me:~$ docker run --rm --name commatest -d -e PSEUDO_LIST='CN=cn\\,OU=ou,CN=cn2\\,OU=ou2' busybox sleep 1000; docker inspect commatest | grep PSEUDO_LIST; docker stop commatest;
dedb0c4eed40454af55519df864468602785ab247c0e6ff85943d56c1f784aa1
                "PSEUDO_LIST=CN=cn\\\\,OU=ou,CN=cn2\\\\,OU=ou2",
commatest

# Double quote, single backslash
me@me:~$ docker run --rm --name commatest -d -e PSEUDO_LIST="CN=cn\,OU=ou,CN=cn2\,OU=ou2" busybox sleep 1000; docker inspect commatest | grep PSEUDO_LIST; docker stop commatest;
31e1051926400ca0b02ddd2ad17146c2a46ba62dd2a724afee5aba47f243551e
                "PSEUDO_LIST=CN=cn\\,OU=ou,CN=cn2\\,OU=ou2",
commatest

# Double quote, double backslash
me@me:~$ docker run --rm --name commatest -d -e PSEUDO_LIST="CN=cn\\,OU=ou,CN=cn2\\,OU=ou2" busybox sleep 1000; docker inspect commatest | grep PSEUDO_LIST; docker stop commatest;
ae65699be53810f773f0d42c43ab1f884c4d7111c2c22ec3a489a19b534d0dd4
                "PSEUDO_LIST=CN=cn\\,OU=ou,CN=cn2\\,OU=ou2",
commatest

Поведение по умолчанию в bash состоит в отображении только двух обратных косых черт в этом сценарии: '\\', но это явно не то же самое для docker:

# Single quote, single backslash
me@me:~$ PSEUDO_LIST='CN=cn\,OU=ou,CN=cn2\,OU=ou2'; echo "${PSEUDO_LIST}"
CN=cn\,OU=ou,CN=cn2\,OU=ou2

# Single quote, double backslash
me@me:~$ PSEUDO_LIST='CN=cn\\,OU=ou,CN=cn2\\,OU=ou2'; echo "${PSEUDO_LIST}"
CN=cn\\,OU=ou,CN=cn2\\,OU=ou2
alin@Touchbar-Monstrosity:~$

# Double quote, single backslash
me@me:~$ PSEUDO_LIST="CN=cn\,OU=ou,CN=cn2\,OU=ou2"; echo "${PSEUDO_LIST}"
CN=cn\,OU=ou,CN=cn2\,OU=ou2

# Double quote, double backslash
me@me:~$ PSEUDO_LIST="CN=cn\\,OU=ou,CN=cn2\\,OU=ou2"; echo "${PSEUDO_LIST}"
CN=cn\,OU=ou,CN=cn2\,OU=ou2

Дополнительная информация:

  • Docker версия 19.03.5, сборка 633a0ea
  • ОС: MacOS Mojave 10.14.6

Я мог бы повторить это на наших linux серверах:

  • Docker версия 18.09.6, сборка 481bc77156
  • ОС: Red Hat Enterprise Linux Серверная версия 7.7

1 Ответ

2 голосов
/ 20 января 2020

Обратные косые черты присутствуют, потому что вы просматриваете вывод JSON, и обратные косые черты должны быть экранированы в JSON строках.

Если вы распечатаете переменную окружения напрямую, вы увидите, что обратные косые черты не отображаются. фактически не удваивается:

$ docker run --rm -it -e PSEUDO_LIST='CN=cn\,OU=ou,CN=cn2\,OU=ou2' busybox sh -c 'echo "$PSEUDO_LIST"'
CN=cn\,OU=ou,CN=cn2\,OU=ou2

В качестве альтернативы, используйте JSON -осведомленный инструмент, такой как jq , чтобы напечатать значение переменной необработанного окружения:

$ docker inspect commatest | jq -r '.[].Config.Env[0]'
PSEUDO_LIST=CN=cn\,OU=ou,CN=cn2\,OU=ou2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...