在我的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"
为什么会发生?
答案 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进行部署。特别是如果您正在寻找诸如docker-swarm或kubernetes之类的多主机部署解决方案,那么该映像必须自包含并包含脚本,这一点很重要。
答案 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