我正在使用下一个命令以交互模式打开一个 docker 容器,并在 bash session 中使用以下命令与这个容器。
docker run -v /scriptsIA:/scriptsIA -v /opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA -it dbmobilelife/docker-python-opencv-tesseract bash
cd /scriptsIA/
python
from SegmentarImagen import *
extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
exit()
exit
我尝试创建一个 bash 脚本如下:
#!/bin/bash
docker run -v /scriptsIA:/scriptsIA -v /opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA -it dbmobilelife/docker-python-opencv-tesseract bash
cd /scriptsIA/
python
from SegmentarImagen import *
extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
exit()
exit
但是,当我执行这个 bash 脚本时,我得到的只是以下错误:
[root@poketrainer /]# sh scriptIA.sh docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"bash\r\": executable file not found in $PATH": unknown. : No existe el fichero o el directorio scriptIA.sh: línea 4: $'python\r': no se encontró la orden scriptIA.sh: línea 5: from: no se encontró la orden scriptIA.sh: línea 6: error sintáctico cerca del elemento inesperado
"/imgsIA/andres.jpg"' 'criptIA.sh: línea 6:
extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
如何在不出错的情况下执行上面解释的 bash 脚本?
最佳答案
这里的脚本有多个问题:
\r
错误如:
starting container process caused "exec: \"bash\r\": executable file not found in $PATH": unknown
与其他类似的错误相关:\r
表示您的脚本中有 Windows 回车 - 它可能是在 Windows 上编写并安装在 VM 中,或者您的编辑器以某种方式添加了这些字符(参见 this post)。 Linux 只需要 \n
并将 \r
视为命令的一部分。尝试在您的文件上运行 dos2unix
或确保没有特殊字符。
此外,该脚本还有几个问题:
- 您正在尝试运行 docker exec,它运行 bash 命令,cd 并运行 python 脚本。这可以稍微简化(见下文)
- 你要运行Python,可能不需要先运行
bash
,直接运行python
命令即可 - 鉴于您要运行 2 个 Python 命令,您将需要换行符,that's possible but not very handy .最好先创建一个 Python 脚本并将其挂载到镜像中,然后再运行一个简单的 python 命令。
- 最好还是用docker exec
-w
flag而不是使用cd
命令来设置工作目录 - 不需要 exit 或 exit(),因为一旦没有更多指令要执行,它就会隐式完成
考虑到所有这些,您可以:
运行单个命令,例如
docker exec [...] -it -w /scriptsIA dbmobilelife/docker-python-opencv-tesseract \ echo -e "from SegmentarImagen import *\nextraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")" | python
在其中您使用
-w
设置工作目录并通过 echo 和管道传递其内容来运行 Python 命令(注意\n
没有空间)正确的 Python 语法)创建一个
myscript.py
脚本,例如:from SegmentarImagen import * extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
然后将该脚本挂载到容器中并运行一个简单的 python 命令:
docker exec [...] -it -w /scriptsIA -v /path/to/myscript.py:/myscript.py \ dbmobilelife/docker-python-opencv-tesseract \ python /myscript.py
注意:[...] 用于我剪切的 -v/scriptsIA:/scriptsIA -v/opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA
卷安装为了简化
关于spring - 我在运行以交互模式打开 docker 容器并执行一些命令的 bash 脚本时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55326559/