我使用以下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:对不起,我英语不好,我是中国学生
答案 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