Docker-在$ PATH中找不到可执行文件

时间:2018-08-09 12:08:51

标签: docker ubuntu groovy nexus

在我的Ubuntu服务器中,我具有以下目录结构: / home / docker / groovy 。在这个位置,我有简单的常规文件。在Docker上,它正在运行容器 groovy_repo_1

进入groovy目录后,我想在容器上执行以下脚本:

docker exec groovy_repo_1 docker.groovy

输出:

rpc error: code = 2 desc = oci runtime error: exec failed: 
container_linux.go:247: starting container process caused "exec: 
\"docker.groovy\": executable file not found in $PATH"

为什么会发生?

3 个答案:

答案 0 :(得分:1)

您的服务器和容器具有不同的文件系统,除非您另外指定--volume命令将服务器文件夹安装在容器文件夹上。

由于您在包含该文件的服务器文件夹中运行命令,因此您希望容器知道docker.groovy文件的名称。

执行此操作的一种方法是启动一个容器,将当前服务器文件夹随机安装在容器中,然后运行groovy脚本作为入口点。像这样(未经测试)

docker run -v .:/random groovy_repo_1 /random/docker.groovy

答案 1 :(得分:1)

Docker适用于长期不变的图片和短期容器。如果您有要运行的脚本或任何其他类型的程序,则最佳实践通常是package it into an image,然后从中运行一个容器。已经有了一个标准的groovy image,因此您的Dockerfile可以是基本的东西:

FROM groovy:2.6
RUN mkdir /home/groovy/scripts
WORKDIR /home/groovy/scripts
COPY docker.groovy .
CMD ["groovy", "docker.groovy"]

您可以在本地开发和测试您的应用程序,然后使用Docker进行部署。特别是如果您正在寻找诸如之类的多主机部署解决方案,那么该映像必须自包含并包含脚本,这一点很重要。

答案 2 :(得分:1)

  
      
  • 文件是否存在...在容器的路径和内部?
  •   

容器内的路径可能与主机上的路径不同。您可以在构建过程中更新PATH环境变量,也可以使用完整路径调用二进制文件,例如/home/container_user/scripts/docker.groovy(根据提供的问题,我们不知道此文件在您的容器中的位置)。该路径必须是容器内脚本的路径,docker不能直接访问主机文件系统,但是您可以通过卷挂载运行容器,以将主机上的路径绑定到容器中。

  
      
  • 如果它是Shell脚本,请检查第一行,例如#!/bin/bash
  •   

您可能在脚本顶部有一个groovy命令。此二进制文件必须存在于容器内,并且必须位于容器内定义的路径中。

  
      
  • 在linux shell脚本上检查Windows换行符
  •   

如果脚本是在Windows上编写的,则脚本中的换行符可能错误。它将查找groovy\r而不是groovy,并且第一个命令将不存在。

  
      
  • 如果它是二进制文件,则可能是缺少库
  •   

如果用诸如COPY命令之类的方式添加了Groovy二进制文件,而不是在本地进行编译或从程序包管理器进行安装,则会看到此消息。您可以在容器内使用ldd /path/to/groovy来检查链接的库。

此列表来自我的DC2018演示文稿:https://sudo-bmitch.github.io/presentations/dc2018/faq-stackoverflow.html#59

相关问题