如何通过Bash脚本启动Docker容器?解决执行报错问题
解决Docker命令在Bash脚本中运行报错的问题
看起来你的问题根源大概率是脚本的换行符格式不兼容,导致Bash把整个docker run命令当成了一个不存在的文件来执行。让我一步步帮你排查和解决:
问题分析
你看到的错误信息比如:
./run_nlp.sh: line 3: docker run -d -v ... : No such file or directory
这说明Bash没有把docker识别为要执行的命令,而是把整行内容(包括docker和后面的所有参数)当成了一个完整的文件名去查找——这几乎都是因为脚本使用了Windows风格的CRLF(\r\n)换行符,而Linux系统的Bash只支持LF(\n)换行符。每行末尾的\r字符会被Bash当成命令/文件名的一部分,自然找不到对应的文件。
解决方案
1. 检查并转换脚本的换行符
首先用cat命令查看脚本的换行符细节:
cat -A run_nlp.sh
如果每行末尾显示的是^M$,就说明是CRLF格式;正常的Linux脚本应该显示$。
接下来转换为LF格式,有几种方法:
- 用
dos2unix工具(如果已安装):dos2unix run_nlp.sh - 用
sed命令手动替换:sed -i 's/\r$//' run_nlp.sh - 如果用文本编辑器(比如VS Code),可以在右下角切换换行符格式为
LF后重新保存。
2. 优化Docker命令(可选但推荐)
另外注意到你在docker run中同时使用了-d(后台守护进程)和-it(交互式终端)参数,虽然这在Docker中是允许的,但对于后台运行的守护进程来说,-it其实没有必要,反而可能导致一些不可预期的终端关联问题。可以把-it去掉,简化命令,比如:
docker run -d -v /mnt/DataResearch/DataStageData/ed_provider_notes/:/data -v /home/gsilver1/data/QuickUMLS/data/:/data/UMLS ahc-nlpie-docker.artifactory.umn.edu/qumls:1 /home/QuickUMLS/run.sh
3. 验证修复效果
转换完成后,重新运行脚本:
./run_nlp.sh
如果还是有问题,可以先单独在终端执行脚本里的某一行docker run命令,确认命令本身没问题,再排查脚本的其他问题(比如PATH环境变量是否在脚本中被修改)。
内容的提问来源于stack exchange,提问作者horcle_buzz
相关产品推荐
相关产品推荐

