为便于代码调试和维护,一般在生成 Docker 容器时,会将宿主机的目录挂载到容器里。在macOS里使用终端运行 Shell 脚本,调试一切正常,但是在 Windows 里使用 Git Bash 终端运行同样的脚本时,发现挂载失败。
1 问题描述
运行的脚本:run.sh 内容为:
bash
#!/bin/bash
docker run -itd \
-v /path_to_宿主机路径:/path_to_容器路径 \
--name your_container_name \
your_image_name:your_image_version
此脚本在 macOS 下运行正常。但在 Windows 下挂载失败!
2 解决方案
网上搜索一番,发现在 Windows 下,对上面脚本的宿主机的路径使用规则有差异导致的,在 Windows 环境下,需要增加一个"斜杠"即"/
",还是以上面的脚本为例,修改后的样子是
bash
#!/bin/bash
docker run -itd \
-v //path_to_宿主机路径:/path_to_容器路径 \
--name your_container_name \
your_image_name:your_image_version
如下图所示:
注意红框内为两个斜杠"//
"
3 扩展应用
当在使用脚本自动生成挂载宿主机目录时,就必须自适应系统所运行的操作系统环境,根据操作系统确定是否添加多一个斜杠。
bash
#!/bin/bash
OS=$(uname)
auto_slash=""
case "$OS" in
Linux) # 在 Linux 系统上运行
;;
Darwin) # 在 macOS 系统上运行
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*) # 在 Windows 系统上运行
auto_slash="/" # 将 $auto_slash
;;
*)
echo "Unknown OS: $OS" # 在其他系统上运行
;;
esac
此时,将挂载的代码修改成下面的样子就可以了
bash
#!/bin/bash
OS=$(uname)
auto_slash=""
case "$OS" in
Linux) # 在 Linux 系统上运行
;;
Darwin) # 在 macOS 系统上运行
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*) # 在 Windows 系统上运行
auto_slash="/" # 将 $auto_slash
;;
*)
echo "Unknown OS: $OS" # 在其他系统上运行
;;
esac
docker run -itd \
-v ${auto_slash}/path_to_宿主机路径:/path_to_容器路径 \
--name your_container_name \
your_image_name:your_image_version