首页 > 解决方案 > Docker image openjdk:8-jdk-alpine 执行简单命令失败

问题描述

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

Dockerfile

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

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

我的run.sh看起来像这样 在这里输入图像描述 我尝试“docker run -it [images] bash”进入交互环境,我可以看到文件“run.sh”。在目录/bin bash中存在,但是我执行 run.sh 也显示“ /bin/sh: ./run.sh: not found”

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

标签: javadocker

解决方案


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

你的run.sh脚本有一个 exec 行#!/bin/sh,这意味着它不需要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.shcontains:中的 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

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

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

推荐阅读