Docker:带参数和引号的Entrypoint

5

我正在尝试创建一个带有entrypoint.sh的Docker镜像,并在运行Docker时传递参数,问题是当我想要使用双引号时。

我在许多地方搜索过,也知道这更多是一个Bash问题和如何通过双引号扩展参数,但也许有人有想法如何避免这种情况。

我的 Dockerfile:

FROM centos:7

COPY    entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

我的entrypoint.sh文件:
#!/bin/bash

command --display=true "$@"

执行 Docker:

docker run -ti docker-image:latest --driver="kernel-4.0 kernel-4.1"

期望的行为:

command --display=true --driver="kernel-4.0 kernel-4.1"

实际情况:

command --display=true --driver=kernel-4.0 kernel-4.1

我尝试转义双引号,但是没有效果。

我的期望是在 command 的参数列表中看到 --driver=kernel-4.0 kernel-4.1 作为一个包含空格但不包括引号的单个参数。在Docker外运行相同的命令也能得到相同的结果。您看到了吗? - David Maze
该命令需要带有双引号的参数,在您的示例中,该命令接收了3个参数(--display=true, --driver=kernel-4.0, kernel-4.1)。因为bash会删除引号。 - mrbit01
1个回答

4

你尝试在值之前转义 \ 吗?这对我有用。

#!/bin/bash
echo "all params $@"
command --display=true "$@"

并且

docker run -ti yourimage --driver=\"kernel-4.0 kernel-4.1\"

正如 @David 所提到的那样,这是 Bash 脚本的预期行为。

如果你在 Docker 之外运行 entrypoint.sh,它将忽略引号。

./entrypoint.sh --driver="kernel-4.0 kernel-4.1"

#output

all params --driver=kernel-4.0 kernel-4.1
--display=true --driver=kernel-4.0 kernel-4.1

如何在 Bash 参数中保留引号?


转换不起作用,即使使用\\进行转义,引号仍然被删除。另外,如果您尝试使用set -x,您可以看到Bash内部执行的情况。(编辑:抱歉编辑答案,但我尝试添加Markdown代码) - mrbit01
哦,抱歉,它的意思是使用 \"kernel-4.0 kernel-4.1\" - Adiii
"这对我有用,https://dev59.com/FnM_5IYBdhLWcg3wdy_z" - Adiii
我在搜索为什么我的引号在转发到另一个脚本时消失时,来到了这里,所以帮助我的是链接中提出的解决方案:如何在Bash参数中保留引号?-- https://dev59.com/gnI-5IYBdhLWcg3wy70d#1669548 - Anton Daneyko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接