spring - 我在运行以交互模式打开 docker 容器并执行一些命令的 bash 脚本时遇到问题

标签 spring bash docker tomcat

我正在使用下一个命令以交互模式打开一个 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/

相关文章:

java - Spring 找不到 Maven 依赖项中的 jar

java - HHH90001006 : Missing cache[default-update-timestamps-region] was created on-the-fly

java - jsp渲染后的AOP切入点

linux - IFS 变量是否发生以下变化?

linux - 应用程序的 PID 1 在 bash 循环中自动重启

java - 修改Java单元测试中多个bean中使用的参数值

php - 如何从 PHP 页面使用 shell 脚本执行 MySQL 命令?

node.js - 如何使用 child_process 运行返回值列表的 bash 脚本?

apache-spark - 将 spark-jobserver 部署到 BlueMix Spark 节点

azure - Docker-compose,条件语句? (例如系统相关驱动程序)