gpt4 book ai didi

docker - 如何在Docker中的环境变量中传递单个反斜杠

转载 作者:行者123 更新时间:2023-12-02 21:02:36 28 4
gpt4 key购买 nike

我正在尝试将环境变量传递给docker。该变量将由在docker内部运行的应用程序(重新)解释。

该变量应该包含一个用逗号分隔的列表,但是我的列表元素本身包含逗号。

我正在尝试转义列表元素内的逗号,并使用未转义的逗号来分隔元素。

我的列表元素是某些证书的专有名称(因此它们包含逗号)。

我尝试传递用单引号,双引号引起来的环境变量,转义反斜杠并将其转义。这些情况都没有给我一个反斜杠:

# 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 Server 7.7版
  • 最佳答案

    之所以有反斜杠,是因为您要遍历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

    或者,使用JSONt-a之类的支持JSON的工具来打印原始环境变量值:
    $ docker inspect commatest | jq -r '.[].Config.Env[0]'
    PSEUDO_LIST=CN=cn\,OU=ou,CN=cn2\,OU=ou2

    关于docker - 如何在Docker中的环境变量中传递单个反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59827642/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com