【问题标题】:Docker - executable file not found in $PATHDocker - 在 $PATH 中找不到可执行文件
【发布时间】:2019-01-16 21:30:16
【问题描述】:

在我的 Ubuntu 服务器中,我有以下目录结构:/home/docker/groovy。在这个位置,我有简单的 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"

为什么会这样?

【问题讨论】:

    标签: docker ubuntu groovy nexus


    【解决方案1】:

    您的服务器和您的容器具有不同的文件系统,除非您使用 --volume 命令另外指定将服务器文件夹挂载到容器文件夹上。

    在这里您希望您的容器知道 docker.groovy 文件 juste 因为您在包含该文件的服务器文件夹中运行该命令。

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

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

    【讨论】:

    • 以同样的方式我将能够在运行 Nexus 容器上运行脚本?您的命令不会创建和运行 Groovy 容器?
    • 我不确定我理解你打算做什么@Wicia?如果您询问您的 docker.groovy 是否能够访问正在运行的 Nexus,是的。你应该阅读如何使用hub.docker.com/_/groovy
    • 我想运行 Nexus 容器并使用 groovy 脚本创建额外的存储库。
    • 好的,这是关于启动配置/初始化的。我在这里使用的模式是编写一个 docker compose 文件,它会启动你的应用程序(nexus / wildfly / database /whatever)以及一个等待应用程序运行然后运行(groovy)脚本的容器。这里解释了docs.docker.com/compose/startup-order。你可以用 nexus / widfly 替换 db 容器,用执行你的 groovy 初始化脚本的官方 groovy 容器替换 web 容器。
    • 是的,这是一个关于通过容器 B 从容器 A 备份数据库的示例:docs.docker.com/compose/compose-file/…。这个概念被称为边车,如microservicepatterns.org/design_patterns/container_sidecar
    【解决方案2】:

    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 进行部署。特别是如果您正在寻找像 这样的多主机部署解决方案,重要的是图像是独立的并且包含脚本。

    【讨论】:

      【解决方案3】:
      • 文件是否存在...在路径和容器内?

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

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

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

      • 检查 linux shell 脚本上的 windows 换行符

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

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

      如果 groovy 二进制文件是使用 COPY 命令之类的命令添加的,而不是在本地编译或从包管理器安装,您会看到这一点。您可以在容器内使用ldd /path/to/groovy 来检查链接的库。

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

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2021-11-23
        • 2017-09-25
        • 2016-04-19
        • 2018-05-23
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多