msys2和Docker运行时指定命令:在运行Docker之前先在本地查找命令。

10

在msys2中,每当我尝试执行 docker run [image] [cmd] 命令时,如果我要在Docker容器中运行的命令覆盖了Dockerfile中指定的命令,则它会在本地查找该命令,如果不存在则失败。

例如,我的组织有一个Docker镜像,其中Python可执行文件位于/usr/src/venv/bin/python,而且Python不在$PATH中。 这不是我的本地Python安装位置,当我尝试运行 docker run myimage /usr/src/venv/bin/python test.py时,我会收到此错误:OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"C:/msys64/usr/src/venv/bin/python\": stat C:/msys64/usr/src/venv/bin/python: no such file or directory" 此镜像不是Windows镜像,因此它根本不应该查找C:,所以我必须得出结论,它正在本地查找该命令,而不是在容器内查找。

注意:我运行的Docker是添加到msys2中的$PATH的Windows版。

$ which docker
/c/Program Files/Docker/Docker/Resources/bin/docker.exe

我曾使用的一种解决方法是创建一个新的Dockerfile,其中只有一行指定要使用的镜像,另一行是我想要执行的命令。然后我可以运行docker run some-image而无需指定命令,它就能正常工作。

有没有一种方法可以在不使用上述麻烦的解决方法的情况下,在msys2中解决这个问题?


为了进行故障排除,请尝试以下命令:docker run --entrypoint=/usr/src/venv/bin/python myimage test.py - Robert
@tukan,我不确定你具体在建议什么。那似乎根本不是Docker命令的有效格式。 - Robert Hickman
@Robert,问题不在于我无法运行docker命令,而是因为在我的团队中,我们有shell脚本自动运行一系列命令,由于msys2+docker-for-windows中的这种奇怪行为,这些脚本不能直接为我工作。我完全有能力让它工作,但似乎这是非标准的docker行为。在powershell中运行上述相同的docker命令可以正常工作。Powershell并不是一个很好的选择,因为shell脚本需要类似bash的环境。 - Robert Hickman
1
它能用双斜杠正常工作吗?docker run myimage //usr/src/venv/bin/python test.py - Robert
1
是的!完全成功了。非常感谢。 - Robert Hickman
显示剩余3条评论
1个回答

3
这是由于MinGW Posix路径转换引起的。这里可以了解更多信息。
我找到了两个解决方法。
一种方法是,在路径前加上双斜杠//,这样MSYS就不会转换路径。
docker run myimage //usr/src/venv/bin/python test.py
                   ^^this

另一种方法是通过在Windows Git MSys中设置MSYS_NO_PATHCONV=1或在MSYS2中设置MSYS2_ARG_CONV_EXCL="*"来抑制路径转换。
来源: 如何阻止mingw和msys在命令行中给出的路径名被篡改? https://github.com/git-for-windows/git/issues/577#issuecomment-166118846

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