Linux docker run bash差异

Linux docker run bash差异,linux,docker,Linux,Docker,我使用docker容器来备份数据库,如下面的脚本所示 docker run --rm -i -e dbuser=root dbpass=xfdZdfd dbhost=abc.come dbport=32 docker.abc.com/tools/mysql-client bash -c "mysqldump -u$dbuser -p$dbpass -h$dbhost -P$dbport db1 > db1.sql" 然后,我使用env在图像中创建一个不同的图像,比如将脚本添加到docke

我使用docker容器来备份数据库,如下面的脚本所示

docker run --rm -i -e dbuser=root dbpass=xfdZdfd dbhost=abc.come dbport=32 docker.abc.com/tools/mysql-client bash -c "mysqldump -u$dbuser -p$dbpass -h$dbhost -P$dbport db1 > db1.sql"
然后,我使用env在图像中创建一个不同的图像,比如将脚本添加到docker文件

ENV dbuser root
ENV dbpass xfdZdfd
ENV dbhost abc.come
ENV dbport 32
在命令行中,我必须使用
而不是
, 喜欢下面的命令

docker run --rm -i  docker.abc.com/tools/mysql-client bash -c 'mysqldump -u$dbuser -p$dbpass -h$dbhost -P$dbport db1 > db1.sql'

由于不同之处在于添加变量,为什么我必须使用“或”

在这种情况下,您必须使用单引号(
)来防止shell替换

Shell示例:

$ WHAT=sandwiches
$ echo "I like $WHAT"
I like sandwiches
$ echo 'I like $WHAT'
I like $WHAT
如果在调用docker时使用双引号,则变量将由您自己的shell而不是容器中的shell替换

由于它们在shell中可能没有任何值,因此在容器中执行命令之前,它们将被替换为空字符串,这就是为什么需要使用单引号来防止这种情况