我无法运行以交互模式打开docker容器并执行一些命令的bash脚本

时间:2019-03-24 17:33:09

标签: spring bash docker tomcat

我正在使用下一个命令以交互模式打开docker容器,并在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脚本:

#!/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:来自以下人员的错误响应   守护程序:OCI运行时创建失败:container_linux.go:344:正在启动   容器进程导致“ exec:\“ bash \ r \”:找不到可执行文件   in $ PATH“:未知。:不存在el fichero o el directorio   scriptIA.sh:拉丁语4:$'python \ r':无密码   scriptIA.sh:lnea,5点来自:没有密码保护scriptIA.sh:lnea   6:错误sinácticocerca del elemento inesperado   "/imgsIA/andres.jpg"' 'criptIA.sh: línea 6: extraerNombreUsuarioNiveldeUnaFoto(“ / imgsIA / andres.jpg”)

我如何做上面解释的bash脚本而不会出错?

2 个答案:

答案 0 :(得分:1)

此处的脚本存在多个问题:

\r错误,例如:

  

启动容器过程导致“ exec: \“ bash \ r \”:在$ PATH中找不到可执行文件”:未知

与其他类似的错误相关:\r表示脚本中有Windows回车符-它可能是在Windows上编写并挂载在VM中的,或者您的编辑器以某种方式添加了这些字符(请参见{{ 3}})。 Linux仅期望\n并将\r视为命令的一部分。尝试在文件上运行dos2unix或确保没有特殊字符。


此外,脚本还有几个问题:

  • 您正在尝试运行docker exec,该exec运行一个bash命令,该cd并运行一个python脚本。这可以简化一些(见下文)
  • 您想运行Python,可能不需要先运行bash,可以直接运行python命令
  • 假设您要运行2个Python命令,则需要换行符this post。最好在运行简单的python命令之前创建一个Python脚本并将其安装在映像中。
  • 最好使用that's possible but not very handy而不是使用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卷安装

答案 1 :(得分:0)

您的问题不是很清楚,我无法拉出您的docker映像,所以即时通讯有点猜测,但是对我来说,您似乎在尝试bash脚本:

  • 运行docker容器
  • 在容器内,打开python shell
  • 在python shell中运行python脚本

这可能需要从sh文件中询问。

您看到,bash脚本不是操作系统正在逐个运行的命令列表。 当您运行bash脚本时,这是一个进程,它具有自己的规则。

如果要在一个命令中完成所有这些任务,则必须将脚本分成几部分:

python脚本:

//run_python.py

#!/usr/bin/env python

from SegmentarImagen import *
extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
exit()

将此脚本放入主机的/ scriptsIA目录中,以便可以通过该卷在容器中使用它。

//run_container.sh

#!/bin/bash

//a cmd var- this is the command we will be executing inside the container:

cmd=cd /scriptsIA/ && python run_python.py

 docker run
 -v /scriptsIA:/scriptsIA
 -v /opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA
 -it dbmobilelife/docker-python-opencv-tesseract $cmd 

现在您可以轻松运行./run_container.sh来使所有这些变得生动起来。祝你好运!