java - Docker image openjdk:8-jdk-alpine 执行简单命令失败
问题描述
我使用以下 Dockerfile 从 openjdk:8-jdk-alpine 创建了一个 docker 映像:
但是当我尝试执行简单的命令时,会出现以下错误:
/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:对不起我的英语不好,我是中国学生
解决方案
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.sh
contains:中的 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' ]