Docker映像openjdk:8-jdk-alpine无法执行简单的命令

时间:2018-11-20 14:42:05

标签: java docker

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

Dockerfile

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

/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:对不起,我英语不好,我是中国学生

1 个答案:

答案 0 :(得分:1)

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

您的commit脚本的执行行为run.sh,这意味着它不需要#!/bin/sh即可运行,因此我之前的评估是错误的。

从Mac上开始,我创建了一个bash脚本,(大多数情况下)复制了dockerfile,并且该文件正确运行,产生了有效的运行结果。

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

run.sh

看起来像您的错误消息的可疑

因此,这会让我相信您的$ 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 文件包含dos行结尾。根据图像,我猜您是在Windows上,这是run.sh脚本产生问题的地方。

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

  • run.sh
  • dos2unix run.sh

上一个答案

此问题的最可能原因是perl -pi -e 's/\r\n/\n/g' run.sh中的shebang行包含:run.sh或类似内容-即,它没有引用将运行shell脚本。

在高山上,bash已安装到#!/usr/bin/bash中,因此,如果您尝试运行脚本,则会看到错误:

/bin

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

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

echo "Hi"

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

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

解决方法(2)-如果您不想进行这样的符号链接,则可以始终将bash作为CMD的一部分进行调用-

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