发送到 docker 容器 shell exec 的命令失败
我正在启动一个容器,以在主机文件上发出一些命令。
这是通过 shell 脚本完成的:
echo "--- Starting container"
container_id=$(docker run -d -it --mount type=bind,source="$mount_path",target=/usr/share --name project-test python:3.5.2-alpine)
docker exec $container_id /bin/sh -c "cd /usr/share && pwd && ls -l"
但是这会引发一个错误,我不知道如何修复:
OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "C:/Program Files/Git/usr/bin/sh": stat C:/Program Files/Git/usr/bin/sh: no such file or directory: unknown
我的主机是 Windows 10。据我所知,容器上的
exec
命令应该在容器内运行。但错误显示来自我的主机的路径。
为什么会这样?如何正确向docker容器发送命令?
编辑:
docker exec
之后容器的日志为:
Python 3.5.2 (default, Dec 27 2016, 21:33:11)
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
编辑:手动发出命令的结果(预期结果)
/ # cd /usr/share && pwd && ls -l
/usr/share
total 5
-rwxr-xr-x 1 root root 347 May 20 06:31 README.md
drwxrwxrwx 1 root root 4096 May 20 08:22 myproject
docker exec $container_id ls -l /usr/share
ls: C:/Program Files/Git/usr/share: No such file or directory
您获取的
container_id
可能不正确。在继续之前,请确保在此变量中正确设置了值。
在此之前请注意:您同时使用了
-d
和
-it
选项。由于您告诉容器作为守护进程运行,因此
-it
被忽略,您不会将 TTY 附加到它。
-it
选项在这里被完全忽略。
当您
exec
进入容器时,它会在容器中运行一个新会话。这意味着您不会在日志中看到您给出的命令的结果,因为它在新会话的输出中。
要访问日志,您必须在使用
exec
时使用
-it
选项。如果您参考 @nish8690 关于
Docker exec in docker windows
的问题,则需要在命令中将斜线加倍:
instead of
docker exec -it [containerid] /bin/sh
try to use
docker exec -it [containerid] //bin//sh
-- @nish8690, Docker exec in docker windows
结果可能是:
docker exec -it $container_id //bin//sh -c "cd /usr/share && pwd && ls -l"
在 Windows 主机上使用 docker 时,斜杠会转换为 Windows 斜杠,因此 git 会造成混淆。 要从 Windows 主机访问 docker 机器,您必须改用双斜杠来覆盖 Windows 斜杠格式。
一个如何运行文件的示例,您需要运行
//run.sh
,而不是运行
/run.sh
。
此解决方案将解决您的问题。