【问题标题】:Docker image openjdk:8-jdk-alpine fails to execute a simple commandDocker image openjdk:8-jdk-alpine 执行简单命令失败
【发布时间】:2019-04-23 01:01:09
【问题描述】:

我使用以下 Dockerfile 从 openjdk:8-jdk-alpine 创建了一个 docker 映像:

但是当我尝试执行简单的命令时,出现以下错误:

/bin/sh: ./run.sh: not found

我的 run.sh 看起来像这样 enter image description here 我尝试“docker run -it [images] bash”进入交互环境,我可以看到文件“run.sh”。在目录/bin bash存在,但我执行run.sh也显示“/bin/ sh: ./run.sh: 未找到"

PS:对不起我的英语不好,我是中国学生

【问题讨论】:

  • 尝试将ADD更改为COPY
  • run.sh看起来怎么样?
  • 我未能重现该问题。我建议您使用更简单的Dockerfile 再试一次,其中包括一个简单的run.sh(例如,只是回显一些文本)。如果您可以重现 - 在此处更新,否则 - 尝试按照您的要求工作,看看它在哪里中断。
  • 尝试将 run.sh 添加到特定目录。例如ADD run.sh /tmp/run.sh,然后将您的 CMD 更改为 CMD /run.sh
  • 只需添加CMD ["/run.sh"]

标签: java docker


【解决方案1】:

run.sh的打印内容,说明我原来的评估有误;但是根据错误消息和 run.sh 文件的图像,我有线索。

你的run.sh 脚本有一个#!/bin/sh 的exec 行,这意味着它不需要bash 来运行,所以我之前的评估是错误的。

在 Mac 上开始,我创建了一个 run.sh 脚本,复制了 dockerfile(大部分),它运行正确,产生了有效的运行。

然后我将run.sh 转换为使用dos 行结尾并得到以下结果:

$ file run.sh
run.sh: POSIX shell script text executable, ASCII text, with CRLF line terminators
$ docker run --rm -it bob
/bin/sh: ./run.sh: not found

这看起来可疑像你的错误信息。

由此,我会相信您的run.sh 文件包含dos 行结尾。根据图像,我猜你是在 Windows 上,这就是 run.sh 脚本的问题所在。

如何转换行尾(一些例子):

  • dos2unix run.sh
  • perl -pi -e 's/\r\n/\n/g' run.sh

上一个答案

这个问题最可能的原因是run.sh 中的 shebang 行包含:#!/usr/bin/bash,或类似的东西 - 即它没有引用将运行 shell 脚本的二进制文件的有效路径.

在 alpine 上,bash 被安装到 /bin,所以如果你尝试运行脚本你会看到错误:

/ # ./run.sh
/bin/sh: ./run.sh: not found
/ # cat run.sh
#!/usr/bin/bash

echo "Hi"

解决方法(1):在 apk 添加 bash 之后,执行:

RUN ln -s /bin/bash /usr/bin

在您的 Dockerfile 中。这将为 bash 创建一个符号链接,允许程序运行:

/ # ln -s /bin/bash /usr/bin
/ # ./run.sh
Hi

workaround(2) - 如果您不想创建这样的符号链接,您可以随时调用 bash 作为 CMD 的一部分 -

CMD [ 'bash', './run.sh' ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2019-06-23
    • 2014-12-12
    • 2019-12-31
    相关资源
    最近更新 更多