通过“ docker exec”执行bash脚本时,Docker在主机上查找脚本,但不在容器中查找脚本

问题描述

我正在尝试使用以下命令在Docker容器内执行脚本:

docker exec <my-container> bash -c "/tmp/scripts/script.sh"

由于这个原因,我在Windows 10上使用Git Bash。不幸的是,这将返回错误

bash: C:/Users/<windows-user>/AppData/Local/Temp/scripts/script.sh: No such file or directory

因此,我可以轻松得出结论,Git Bash试图在主机Windows计算机上找到脚本,而不是在容器内部(这是预期的行为)。

同时,PowerShell按预期运行此命令-脚本在容器内执行。

这种行为的可能是什么原因以及如何解决


注意。我找到了一种解决方法

commandtorun='bash -c "/tmp/scripts/script.sh"'
docker exec <my-container> $commandtorun

成功了。但是我仍然很感兴趣为什么初始命令不起作用。

解决方法

我仍然对初始命令为什么不起作用感兴趣。

可能是因为bash解释了传递给docker exec的参数。

  • 在第一种情况下,共有3个,包括"/tmp/scripts/script.sh",其/tmp被重新解释为C:/Users/<windows-user>/AppData/Local/Temp/
  • 在第二种情况下,只有一个'bash -c "/tmp/scripts/script.sh"'使用字符串引号('),并按原样传递给docker exec
    然后,在容器上下文中执行all命令,并且在该上下文中,/tmp/scripts/script.sh是有效路径。