【问题标题】:Docker entrypoint not found although in PATH (and executable)尽管在 PATH(和可执行文件)中但未找到 Docker 入口点
【发布时间】:2018-07-26 07:41:14
【问题描述】:

我正在使用以下 Dockerfile 创建一个简单的图像

FROM docker:latest

COPY docker-entrypoint.sh /usr/local/bin

ENTRYPOINT ['docker-entrypoint.sh']

在我的容器内:

/ # ls -al $(which docker-entrypoint.sh)
-rwxrwxr--    1 root     root           476 Jul 26 07:30 /usr/local/bin/docker-entrypoint.sh

所以入口点文件在PATH都是可执行文件;

但是在运行的时候

docker run -v /var/run/docker.sock:/var/run/docker.sock -it imageinit
/bin/sh: [docker-entrypoint.sh]: not found

我知道this SO question,但这是关于PATH 和文件权限的问题(已解决);

【问题讨论】:

    标签: docker docker-entrypoint


    【解决方案1】:

    有趣的是,您的问题似乎与您选择使用的引号类型有关。如果您更改此行:

    ENTRYPOINT ['docker-entrypoint.sh']
    

    ENTRYPOINT ["docker-entrypoint.sh"]
    

    然后一切都开始按预期工作。

    如果您检查the documentation for the type of ENTRYPOINT you are using,所有示例都有双引号。

    我怀疑当您使用单引号时发生的情况是 docker 将其解析为 ENTRYPOINT 的 shell 形式并尝试执行一个名为 [docker-entrypoint.sh] 的脚本,这将解释错误消息(因为显然没有该名称将存在)。

    【讨论】:

    • 额外细节:在您链接到它的文档中提到双引号的原因是因为 docker 将值解析为 json 数组。
    • 感谢您提供额外信息!这让我想到了为什么当它使用单引号时它们没有打印在错误中。当我找到答案时,我会分享以防其他人感兴趣。当 docker 找到一个 ENTRYPOINT 命令时,它使用parseEntrypoint 在同一个文件中调用 parseShellDependentCommand。然后检查命令是否是有效的 JSON,如果不是,则将 shell 附加到命令中。所以它实际上运行/bin/sh ['docker-entrypoint.sh'] 并且shell 吞下了引号
    • 就是这样的东西让我想放弃科技!
    【解决方案2】:

    docker-entrypoint.sh 脚本包含回车时,我在相同情况下遇到完全相同的错误(尽管没有单引号问题),使用dos2unix docker-entrypoint.sh 转换脚本为我解决了这个问题。

    【讨论】:

      【解决方案3】:

      我面临同样的问题,我在另一个堆栈上找到的原因是行编码差异,我从一个开源项目中获取了我的 docker 文件, 我在 Docker Desktop for Winodw 上构建和部署我的文件, 我改变了我的 Docker & .sh 文件编码从 CRLF -> LF 并且成功了,您可以使用 VS 代码进行相同的操作,它具有将 CRLF 转换为 LF 的右下角选项。

      【讨论】:

        猜你喜欢
        • 2021-09-16
        • 2019-01-16
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2017-09-25
        • 2020-03-31
        • 2022-06-10
        相关资源
        最近更新 更多